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

如何在Django模板循环中传递多参数给自定义模板标签/过滤器

Django模板中实现房间可用性检查的布尔型标签解决方案

我正在开发一个时间表应用,需要检查指定房间是否可用,想创建一个能返回布尔值的函数/模板标签/过滤器,用于Django模板的if语句中。目前已经编写了模板标签,但无法在模板中正确调用。

现有视图函数

def my_view(request):
    args = {
        'days': Days.objects.all(),
        'times': Times.objects.all(),
        'rooms': Rooms.objects.all(),
    }
    return render(request, 'my_page', args)

期望的模板结构

{% for day in days %}
    {% for time in times %}
        {% for room in rooms %}
            {% if MY_TAG {{ day }} {{ time }} KWARG={{ room }} %}
                <p>SOMETHING IF TRUE</p>
            {% else %}
                <p>SOMETHING IF FALSE</p>
            {% endif %}
        {% endfor %}
    {% endfor %}
{% endfor %}

当前编写的模板标签代码

from ..models import Timetables
from django import template

register = template.Library()


@register.simple_tag
def check_availability(day, time, **kwargs):
    if variable == 'room':
        if Timetables.objects.filter(day=day, time=time, room=kwargs['room']).exists():
            return True
        else:
            return False

问题修复与实现方案

核心问题

  1. 原代码中variable变量未定义,导致逻辑报错。
  2. @register.simple_tag默认返回字符串类型,无法直接在{% if %}中作为布尔值判断,需调整写法。

方案一:使用赋值型Simple Tag(推荐)

修改模板标签,直接接收参数并返回布尔值,在模板中先赋值再判断:

from ..models import Timetables
from django import template

register = template.Library()

@register.simple_tag
def check_availability(day, time, room):
    # 检查该时段是否存在预约,返回房间是否可用(未被预约则返回True)
    return not Timetables.objects.filter(day=day, time=time, room=room).exists()

模板中调用方式:

{% load your_tag_filename %}  <!-- 替换为你的标签文件名(不含.py后缀) -->
{% for day in days %}
    {% for time in times %}
        {% for room in rooms %}
            {% check_availability day time room as is_available %}
            {% if is_available %}
                <p>房间可用</p>
            {% else %}
                <p>房间已被占用</p>
            {% endif %}
        {% endfor %}
    {% endfor %}
{% endfor %}

方案二:使用过滤器(Filter)

如果偏好使用过滤器,可将参数打包后传递:

from ..models import Timetables
from django import template

register = template.Library()

@register.filter(name='is_available')
def is_available(day, args):
    time, room = args
    return not Timetables.objects.filter(day=day, time=time, room=room).exists()

模板中调用方式:

{% load your_tag_filename %}
{% for day in days %}
    {% for time in times %}
        {% for room in rooms %}
            {% with args=(time, room) %}
                {% if day|is_available:args %}
                    <p>房间可用</p>
                {% else %}
                    <p>房间已被占用</p>
                {% endif %}
            {% endwith %}
        {% endfor %}
    {% endfor %}
{% endfor %}

必要配置

  • 确保标签文件放在Django应用的templatetags目录下,且该目录包含__init__.py空文件。
  • 模板开头必须用{% load %}语句加载你的标签库。

内容的提问来源于stack exchange,提问作者xikodev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:07:42