django - 在嵌套的 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})
即我在这个阶段试图过滤掉书籍,但它没有通过模板。
解决方案
我建议您在视图中进行过滤,而不是模板本身。在那里,您可以使用所有 djangos 功能,而无需为模板实现自定义标签/过滤器。然后,您还可以稍后使用 select_/prefetch_related 进行查询优化(如果您有更多查询)。
例子:
class myview(...):
qs = Genre.objects.filter(book_set__year__gt=1950)
...
另请参阅文档中的字段查找以使用gt
.
推荐阅读
- validation - Grails,用于更新的自定义可验证对象
- vba - 预定的定期电子邮件
- python - Elasticsearch - 如何匹配字符串中的数字范围
- javascript - 如何将我的 html/javascript 代码保存为程序?
- dagger-2 - dagger2 在哪里存储作用域实例?
- python - 运行 shell 脚本的 Django 命令
- visual-studio-code - 片段选择:显示一个值并用另一个值完成
- python - ImportError:无法导入名称 FlowReader
- python - 对 Pandas Groupby 中的每个组应用排名
- javascript - OnMouseOver/OnMouseOut 组合不可靠 - 究竟是什么导致了这种情况以及如何最好地解决它?