Django模板:如果错误?

时间:2010-11-19 21:02:12

标签: django django-templates

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

{% if myvar == False %}

似乎不起作用。

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

10 个答案:

答案 0 :(得分:30)

对于后代,我有几个NullBooleanField,这就是我的所作所为:

检查它是否为True

{% if variable %}True{% endif %}

检查它是否为False(注意这是有效的,因为只有3个值 - 真/假/无):

{% if variable != None %}False{% endif %}

检查它是否为None

{% if variable == None %}None{% endif %}

我不确定原因,但我不能variable == False,但我可以variable == None

答案 1 :(得分:26)

Django 1.10 (release notes)isis 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 (release notes)开始,模板引擎会将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'

答案 2 :(得分:22)

您可以编写一个自定义模板过滤器,以便在六行代码中执行此操作:

from django.template import Library

register = Library()

@register.filter
def is_false(arg): 
    return arg is False

然后在你的模板中:

{% if myvar|is_false %}...{% endif %}

当然,您可以使该模板标签更通用......但这特别适合您的需求; - )

答案 3 :(得分:19)

我认为这对你有用:

{% if not myvar %}

答案 4 :(得分:9)

在旧版本中,您只能使用 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%}子句是可选的。

参数可以是硬编码字符串,因此以下内容有效:

{%ifequal user.username“adrian”%}     ... {%endifequal%} ifequal标记的替代方法是使用if标记和==运算符。

ifnotequal 就像ifequal一样,除了它测试两个参数不相等。

ifnotequal标记的替代方法是使用if标记和!=运算符。

但是,现在我们可以轻松使用if / else

{% if somevar >= 1 %}
{% endif %}

{% if "bc" in "abcdef" %}
  This appears since "bc" is a substring of "abcdef"
{% endif %}

复杂表达式

以上所有内容可以合并形成复杂的表达方式。对于此类表达式,了解在计算表达式时如何对运算符进行分组(即优先级规则)非常重要。运算符的优先级从最低到最高,如下所示:

  • in
  • ==,!=,<,>,< =,> =

更多细节

https://docs.djangoproject.com/en/dev/ref/templates/builtins/

答案 5 :(得分:5)

再次遇到这种情况(我之前确定过,并提出了一个不太令人满意的解决方案)。

对于三态布尔语义(例如,使用models.NullBooleanField),这很有效:

{% if test.passed|lower == 'false' %} ... {% endif %}

或者如果你喜欢对整个事情感到兴奋......

{% if test.passed|upper == 'FALSE' %} ... {% endif %}

无论哪种方式,这都会处理您不关心None(在if块中评估为False)或True情况的特殊情况。

答案 6 :(得分:4)

查看yesno帮助

例如:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}

答案 7 :(得分:3)

之前我遇到过这个问题,我通过嵌套的if语句首先单独检查无类型来解决这个问题。

{% 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。

您还可以在Context中包含变量false_list = [False,]然后执行

{% if some_bool in false_list %}False {% endif %}

答案 8 :(得分:3)

我刚刚提出以下在Django 1.8中看起来很好的

尝试这个而不是值不是假:

if value|stringformat:'r' != 'False'

尝试此而不是值为True:

if value|stringformat:'r' == 'True'

除非你真的搞乱 repr 方法使值看起来像一个布尔值我认为这应该给你足够坚定的保证价值是真还是假。

答案 9 :(得分:2)

使用Python(即视图代码)检查比在模板中检查要容易得多,因为Python代码很简单:

myvar is False

龙虎斗:

>>> False is False
True
>>> None is False
False
>>> [] is False
False

模板级别的问题是模板if不解析is(尽管它解析in)。此外,如果您不介意,可以尝试将对is的支持修补到模板引擎中;基于==的代码。