Django模板:如果为false?
如何使用Django模板语法检查variables是否为False ?
{% if myvar == False %}
似乎没有工作。
请注意,我非常特别要检查它是否具有Python值False
。 这个variables也可以是一个空数组,这不是我想要检查的。
Django 1.10 (发行说明)中增加了is
和is not
比较运算符if
标签。 这种改变使得模板中的身份testing非常简单。
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
。
你可以编写一个自定义的模板filter,在六行代码中完成:
from django.template import Library register = Library() @register.filter def is_false(arg): return arg is False
然后在您的模板中:
{% if myvar|is_false %}...{% endif %}
当然,你可以使这个模板标签更通用…但是这适合你的需求具体;-)
我认为这会对你有用:
{% if not myvar %}
在旧版本中,您只能使用ifequal或ifnotequal
{% 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%}子句是可选的。
参数可以是硬编码的string,所以以下是有效的:
{%ifequal user.username“adrian”%} … {%endifequal%} ifequal标记的替代方法是使用if标记和==运算符。
ifnotequal就像ifequal一样,除了testing两个参数是不相等的。
ifnotequal标签的另一种select是使用if标签和!=运算符。
但是,现在我们可以轻松地使用if / else
{% if somevar >= 1 %} {% endif %} {% if "bc" in "abcdef" %} This appears since "bc" is a substring of "abcdef" {% endif %}
复杂的expression式
以上所有可以组合起来形成复杂的expression式。 对于这样的expression式,在评估expression式时知道运算符是如何分组的 – 也就是优先规则是很重要的。 从最低到最高,运营商的优先级如下:
- 要么
- 和
- 不
- 在
- ==,!=,<,>,<=,> =
更多详情
https://docs.djangoproject.com/en/dev/ref/templates/builtins/
我以前有过这个问题,我通过嵌套的if语句首先检查没有单独的types解决。
{% if object.some_bool == None %}Empty {% else %}{% if not object.some_bool %}False{% else %}True{% endif %}{% endif %}
如果你只是想testing它的假,那么只是
{% 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 %}
现在零长度的数组被识别, Nonetypes为Nonetypes; 虚假为假; Trues作为trues; 长度为0以上的string/数组为true。
你也可以在上下文中包含一个variablesfalse_list = [False,]然后做
{% if some_bool in false_list %}False {% endif %}
只是再次遇到这个问题(我以前有过,并且提出了一个不太令人满意的解决scheme)。
对于三态布尔语义(例如,使用models.NullBooleanField
),这个效果很好:
{% if test.passed|lower == 'false' %} ... {% endif %}
或者,如果你喜欢整个事情感到兴奋…
{% if test.passed|upper == 'FALSE' %} ... {% endif %}
无论哪种方式,这将处理您不关心None
(在if块中评估为False)或True
情况的特殊情况。
看看yesno的帮手
例如:
{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
Python(比如你的视图代码)比在模板中更容易检查,因为Python代码很简单:
myvar is False
举例说明:
>>> False is False True >>> None is False False >>> [] is False False
在模板级别的问题是模板if
不parsingis
(虽然它parsing)。 另外,如果你不介意的话,你可以尝试将补丁的补丁插入到模板引擎中; 基于==
的代码。