如何在django模板中区分None
和False
?
{% if x %}
True
{% else %}
None and False - how can I split this case?
{% endif %}
答案 0 :(得分:12)
每个Django模板上下文contains True
, False
and None
。对于Django 1.10及更高版本,您可以执行以下操作:
{% if x %}
True
{% elif x is None %}
None
{% else %}
False (or empty string, empty list etc)
{% endif %}
Django 1.9及更早版本不支持is
标记中的if
运算符。大多数情况下,可以使用{% if x == None %}
代替。
{% if x %}
True
{% elif x == None %}
None
{% else %}
False (or empty string, empty list etc)
{% endif %}
使用Django 1.4及更早版本,您无权访问模板上下文中的True
,False
和None
,而是可以使用yesno
过滤器。< / p>
在视图中:
x = True
y = False
z = None
在模板中:
{{ x|yesno:"true,false,none" }}
{{ y|yesno:"true,false,none" }}
{{ z|yesno:"true,false,none" }}
结果:
true
false
none
答案 1 :(得分:5)
您可以创建自定义过滤器:
@register.filter
def is_not_None(val):
return val is not None
然后使用它:
{% if x|is_not_None %}
{% if x %}
True
{% else %}
False
{% endif %}
{% else %}
None
{% endif %}
当然,您可以调整过滤器以测试您喜欢的任何条件......
答案 2 :(得分:2)
以前答案的增强可能是:
{% if x|yesno:"2,1," %}
# will enter here if x is True or False, but not None
{% else %}
# will enter only if x is None
{% endif %}
答案 3 :(得分:0)
使用misc.context_processors.useful_constants
,True
,False
常量创建context_processor(或使用django-misc模块None
)并使用{% if x == None %}
或{ {1}}
{% if x == False %}
:
context_processor.py
答案 4 :(得分:0)
这是另一个棘手的方法:
{% if not x.denominator %}
None
{% else %}
{% if x %}
True
{% else %}
False
{% endif %}
{% endif %}
那是因为“None”没有属性“denominator”,而“True”和“False”都是1。