【问题标题】:How to pass multiple values from models.py to HTML via views.py in Django如何在Django中通过views.py将多个值从models.py传递到HTML
【发布时间】:2020-06-04 02:27:21
【问题描述】:

我的 Django 博客有以下 models.py,我创建了以下 views.py 来为我的 URL 参数传递 slug 的值。
但是,我正在努力在视图中创建模型以从 Category 类中获取其他数据(人物和描述)。
我自己尝试了一些模式,但无法将它们传递给 HTML。 (总是出错或不显示)
你能告诉我如何解决这个问题吗?

models.py

class Category(models.Model):
    person = models.CharField(max_length=20)
    description = models.TextField()
    slug = models.SlugField()
    def __str__(self):
        return self.person

views.py

def blog_category(request, category):
    posts = Post.objects.filter(categories__slug__contains=category).order_by("-created_on").distinct()
    context = {"category": category, "posts": posts}

    return render(request, "blog_category.html", context)

HTML(Localhost:8000/slug)

{{ person }}
{{ description }}

这是我的models.py的完整代码

class Category(models.Model):
    person = models.CharField(max_length=20)
    description = models.TextField()
    slug = models.SlugField()
    def __str__(self):
        return self.person


class Recommender(models.Model):
    recommender_name = models.CharField(max_length=20)
    slug = models.SlugField()

    def __str__(self):
        return self.recommender_name


class Post(models.Model):
    book_title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    book_link = models.CharField(max_length=255)
    recommenders = models.ForeignKey("Recommender", on_delete=models.CASCADE,)

    source = models.TextField()
    source_link = models.CharField(max_length=255)
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)

    categories = models.ManyToManyField("Category", related_name="posts")

    slug = models.SlugField()

    def __str__(self):
        return self.book_title

【问题讨论】:

  • 你也可以展示你的Post模型类吗?
  • @ArunT 我已经更新了我的问题。我尝试了您在此处询问之前删除的内容,但没有显示任何内容。
  • 我快速阅读了您的两个问题,因此错过了您的模型类的名称。给我一点时间,我会给你正确的方法
  • 我已经更新了答案,因为你使用的是 manytomany 字段,你将在 Post.categories 中多了一个列表,所以你需要两个 for 循环。

标签: python django


【解决方案1】:
posts = Post.objects.filter(categories__slug__contains=category).order_by("-created_on").distinct()

将返回一个查询集。它可以有多个模型类的实例(因为您使用的是filter)。在您的上下文中,您将此查询集作为 posts 发送到您的模板。

所以在你的 HTML 中你可以使用这样的东西。您需要使用 for 循环,因为 posts 中可以有多个项目。

{% for post in posts %}
    {% for category in post.categories.all %}
        {{ category.person }}
        {{ category.description }}
    {% endfor %}
{% endfor %}

【讨论】:

  • 谢谢你,但这给了我另一个错误'ManyRelatedManager'对象不可迭代。我会找出解决方法。
  • 糟糕我忘了,把{% for category in post.categories %}改成{% for category in post.categories.all %}
  • 另外,请查看answer
  • 非常感谢。这是完美的工作。请允许我再问一个问题。有什么方法可以在不使用 for 循环的情况下从人员和描述中获取价值?您不需要提供编码,但我只想知道是否有任何方法可以做到这一点。
  • 这里最好使用prefetch_related 来提高性能并防止从模板到数据库的循环查询。请查看 Django 文档here
【解决方案2】:

我会看this example

也就是说,如果您像示例中所示那样渲染模板,您应该可以这样做

{{ category.person }} {{ category.description }}

【讨论】:

  • 谢谢,我会参考链接的。
猜你喜欢
  • 2018-01-29
  • 2022-11-02
  • 2021-12-31
  • 2020-12-24
  • 2017-05-08
  • 2022-10-23
  • 2018-02-04
  • 2014-01-13
  • 2018-12-19
相关资源
最近更新 更多