Django模板:如果为false?

如何使用Django模板语法检查variables是否为False

{% if myvar == False %} 

似乎没有工作。

请注意,我非常特别要检查它是否具有Python值False 。 这个variables也可以是一个空数组,这不是我想要检查的。

Django 1.10 (发行说明)中增加了isis 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 (发行说明)开始 ,模板引擎会将TrueFalseNone解释为相应的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 %} 

在旧版本中,您只能使用ifequalifnotequal

 {% 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)。 另外,如果你不介意的话,你可以尝试将补丁的补丁插入到模板引擎中; 基于==的代码。