You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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í

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:23:17