如何使用Django模板语法检查变量是否为False?
{% if myvar == False %}
似乎不起作用。
请注意,我非常想检查它是否具有Python值False
。这个变量也可以是一个空数组,这不是我想要检查的。
如何使用Django模板语法检查变量是否为False?
{% if myvar == False %}
似乎不起作用。
请注意,我非常想检查它是否具有Python值False
。这个变量也可以是一个空数组,这不是我想要检查的。
{% if not myvar%}
它肯定可以在Django 1.11中运行,但是我还没走多远!
myvar
是布尔值,not myvar
则True
无论其值(true或false)由render函数将其作为上下文变量发送到模板, 都会返回吗?在这种情况下,应该检查两件事:1-myvar
提供给了render函数,2-提供了什么值myvar
。如果myvar
更多的是类实例,字典,对象等而不是经典变量,这将非常复杂。
Answers:
Django 1.10 (发行说明)在标签中添加了is
和is not
比较运算符if
。此更改使模板中的身份测试非常简单。
In[2]: from django.template import Context, Template
In[3]: context = Context({"somevar": False, "zero": 0})
In[4]: compare_false = Template("{% if somevar is False %}is false{% endif %}")
In[5]: compare_false.render(context)
Out[5]: u'is false'
In[6]: compare_zero = Template("{% if zero is not False %}not false{% endif %}")
In[7]: compare_zero.render(context)
Out[7]: u'not false'
如果您使用的是旧版Django,则从1.5版(发行说明)开始,模板引擎会将解释为True
,False
并将None
其解释为对应的Python对象。
In[2]: from django.template import Context, Template
In[3]: context = Context({"is_true": True, "is_false": False,
"is_none": None, "zero": 0})
In[4]: compare_true = Template("{% if is_true == True %}true{% endif %}")
In[5]: compare_true.render(context)
Out[5]: u'true'
In[6]: compare_false = Template("{% if is_false == False %}false{% endif %}")
In[7]: compare_false.render(context)
Out[7]: u'false'
In[8]: compare_none = Template("{% if is_none == None %}none{% endif %}")
In[9]: compare_none.render(context)
Out[9]: u'none'
尽管它不能像人们期望的那样工作。
In[10]: compare_zero = Template("{% if zero == False %}0 == False{% endif %}")
In[11]: compare_zero.render(context)
Out[11]: u'0 == False'
为了后代,我有几个 NullBooleanField
,这是我的工作:
要检查是否True
:
{% if variable %}True{% endif %}
要检查它是否正确False
(请注意,这是可行的,因为只有3个值-True / False / None):
{% if variable != None %}False{% endif %}
要检查是否None
:
{% if variable == None %}None{% endif %}
我不确定为什么,但是我不能variable == False
,但是我可以variable == None
。
models.NullBooleanField()
您可以编写一个自定义模板过滤器,以执行六行代码:
from django.template import Library
register = Library()
@register.filter
def is_false(arg):
return arg is False
然后在您的模板中:
{% if myvar|is_false %}...{% endif %}
当然,您可以使该模板标签更加通用……但这特别适合您的需求;-)
ifs
。酷:)实际上,我通过使用“ None”作为我的错误值来避免了这个问题。
{% ifequal YourVariable ExpectValue %}
# Do something here.
{% endifequal %}
{% ifequal userid 1 %}
Hello No.1
{% endifequal %}
{% ifnotequal username 'django' %}
You are not django!
{% else %}
Hi django!
{% endifnotequal %}
与if标记中一样,{%else%}子句是可选的。
参数可以是硬编码的字符串,因此以下内容有效:
{%ifequal user.username“ adrian”%} ... {%endifequal%} ifequal标记的替代方法是使用if标记和==运算符。
ifnotequal与ifequal一样,只是它测试两个参数是否相等。
ifnotequal标记的替代方法是使用if标记和!=运算符。
{% if somevar >= 1 %}
{% endif %}
{% if "bc" in "abcdef" %}
This appears since "bc" is a substring of "abcdef"
{% endif %}
可以将以上所有内容组合起来以形成复杂的表达式。对于此类表达式,了解对表达式求值时如何对运算符进行分组(即优先规则)非常重要。运算符的优先级从低到高依次为:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/
False
现在是受支持的关键字吗?
再次遇到这个问题(一定是我以前遇到过的,并提出了一个不太令人满意的解决方案)。
对于三态布尔语义(例如,使用models.NullBooleanField
),这很好用:
{% if test.passed|lower == 'false' %} ... {% endif %}
或者,如果您喜欢整个事情都感到兴奋...
{% if test.passed|upper == 'FALSE' %} ... {% endif %}
无论哪种方式,这都可以处理特殊情况,即您不在乎None
(如果在if块中评估为False)或True
大小写。
我以前遇到过这个问题,我通过嵌套的if语句先分别检查none类型来解决。
{% if object.some_bool == None %}Empty
{% else %}{% if not object.some_bool %}False{% else %}True{% endif %}{% endif %}
如果您只想测试其是否为假,则只需
{% if some_bool == None %}{% else %}{% if not some_bool %}False{% endif %}{% endif %}
编辑:这似乎起作用。
{% if 0 == a|length %}Zero-length array{% else %}{% if a == None %}None type{% else %}{% if not a %}False type{% else %}True-type {% endif %}{% endif %}{% endif %}
现在零长度数组就是这样;无类型为无类型;假为假;真理如真理;长度大于0的字符串/数组为true。
您还可以在上下文中包含变量false_list = [False,],然后执行
{% if some_bool in false_list %}False {% endif %}
None
,False
但不是[]
,这也是错误的。
[]
吗?它不认识False
。很遗憾我不得不为此编写自己的模板标签:\
使用Python(即您的视图代码)比使用模板要容易得多,因为Python代码很简单:
myvar is False
说明:
>>> False is False
True
>>> None is False
False
>>> [] is False
False
模板级别的问题是模板if
无法解析is
(尽管它可以解析in
)。另外,如果您不介意,则可以尝试is
将对支持的补丁修补到模板引擎中。基于的代码==
。
== False
应该也一样。我们不需要is
,我们只需要将其识别False
为关键字即可。我想这在您看来建议的视图中最简单,但是...让所有这些一次性布尔值杂乱无章的地方真是令人讨厌。
myvar is False
反对PEP-8;正确的方法是not myvar
0 is False
是False,0 == False
是True-因此,只要您不知道var是布尔值,is
就(不是双关语)可能就不是您想要的。