首页 > 解决方案 > 在嵌套的 for 循环中过滤(django 模板)

问题描述

我有两个模型,书籍和流派。

class Book(models.Model):
     title = models.CharField(max_length=300)
     author = models.CharField(max_length=100)
     year = models.IntegerField()
     genre = models.ForeignKey('Genre', on_delete=models.CASCADE)

class Genre(models.Model):
     title = models.CharField(max_length=20)

在我的网页上,我想显示每种类型,并且在每种类型中,只显示年份为 1950 年或更晚的书籍。我的模板中的代码如下所示:

{% for genre in genres %}
     <h1> {{genre.title}} </h1>
     {% for book in genre.book_set.all %}
          {{book.title}}
     {% endfor %}
{% endfor %}

这样做的问题是它显示了该类型的所有书籍,而不仅仅是 1950 年之后出版的书籍。是否有可能以某种方式过滤genre.book_set.all 的结果以仅获取与某个属性匹配的那些?

编辑 1

我的观点是这样的:

def books_home(request):
    books = Book.objects.filter(year__gt='1950')
    genres = Genre.objects.all()
    return render(request, "index.html", {"books": books, "genres": genres})

即我在这个阶段试图过滤掉书籍,但它没有通过模板。

标签: djangotemplatesfilterforeign-keysnested-loops

解决方案


我建议您在视图中进行过滤,而不是模板本身。在那里,您可以使用所有 djangos 功能,而无需为模板实现自定义标签/过滤器。然后,您还可以稍后使用 select_/prefetch_related 进行查询优化(如果您有更多查询)。

例子:

class myview(...):
    qs = Genre.objects.filter(book_set__year__gt=1950)
    ...

另请参阅文档中的字段查找以使用gt.


推荐阅读