接受布尔参数的Django自定义模板标签

9 投票
1 回答
3994 浏览
提问于 2025-04-16 09:11

根据这个讨论帖,我不能把常量False当作参数传给Django的模板标签,因为它会被当作变量名来处理,而不是内置的常量。

但是,如果我想创建一个需要真/假参数的模板标签,推荐的方式是什么呢?我该如何在Python中创建这个标签,并在模板中调用它呢?

我可以在模板中直接传入1或0,这样也能正常工作。但考虑到Django模板的编写不应该要求模板作者具备计算机编程知识(比如1等于True,0等于False),我在想有没有更合适的方式来处理这种情况。

下面是标签定义和使用的示例:

@register.simple_tag
def some_tag(some_string, some_boolean = True):
    if some_boolean:
        return some_html()
    else
        return some_other_html()

<!-- Error!  False treated as variable name in Request Context -->
{% some_tag "foobar" False %}

<!-- Works OK, but is there a better option? -->
{% some_tag "foobar" 0 %}

1 个回答

17

我之前遇到过这个问题,最后得出的结论是使用1和0是最简单的解决办法。

不过,有个想法是可以添加一个上下文处理器,这样就可以在模板上下文中用相应的名字添加TrueFalse

# projectname/appname/context_processors.py

def booleans():
    return {
        'True': True,
        'False': False,
    }

然后显然你需要在你的Django设置文件中添加这个上下文处理器:

TEMPLATE_CONTEXT_PROCESSORS += {
    'projectname.appname.context_processors.booleans',
}

撰写回答