如何在Django模板中编写model.model_set.filter过滤语句
在Django模板中过滤关联模型集合的解决方案
Django模板语言出于安全和设计限制,不支持在模板中直接调用带参数的方法(比如model_set.filter(days=today)),所以你需要通过以下几种方式实现需求:
方法1:在视图中预处理过滤结果
这是最直接且推荐的方案,把过滤逻辑移到视图层,将处理好的数据集传递给模板:
示例代码
models.py
from django.db import models from datetime import date class Parent(models.Model): name = models.CharField(max_length=100) class Child(models.Model): parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='children') days = models.DateField()
views.py(修改后)
from django.shortcuts import get_object_or_404, render from .models import Parent from datetime import date def parent_detail(request, pk): parent = get_object_or_404(Parent, pk=pk) today = date.today() # 提前过滤出今日的关联数据,作为父模型的属性传入模板 parent.today_children = parent.children.filter(days=today) return render(request, 'parent_detail.html', {'parent': parent})
模板文件(parent_detail.html)
{% for child in parent.today_children %} <p>{{ child.days }} - {{ child.some_field }}</p> {% empty %} <p>今日无相关数据</p> {% endfor %}
方法2:自定义模板过滤器
如果需要在多个模板中复用过滤逻辑,可以自定义模板过滤器:
步骤1:创建模板标签文件
在你的Django应用下新建templatetags目录,添加__init__.py和custom_filters.py:
# yourapp/templatetags/custom_filters.py from django import template from datetime import date register = template.Library() @register.filter def filter_today(queryset): """过滤出日期为今日的数据集""" return queryset.filter(days=date.today())
步骤2:在模板中使用过滤器
{% load custom_filters %} {% for child in parent.children|filter_today %} <p>{{ child.days }} - {{ child.some_field }}</p> {% endfor %}
方法3:给模型添加自定义方法
在父模型中添加一个方法,返回过滤后的关联数据集:
models.py(修改后)
from django.db import models from datetime import date class Parent(models.Model): name = models.CharField(max_length=100) def get_today_children(self): """返回当前父对象下今日的子模型数据""" return self.children.filter(days=date.today())
模板文件中调用
{% for child in parent.get_today_children %} <p>{{ child.days }} - {{ child.some_field }}</p> {% endfor %}
注意:Django模板中调用模型方法时不需要加括号,直接写方法名即可。
内容的提问来源于stack exchange,提问作者Ruairí
相关产品推荐
相关产品推荐

