代码之家  ›  专栏  ›  技术社区  ›  mpen

Django模板:如果为false?

  •  57
  • mpen  · 技术社区  · 14 年前

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

    {% if myvar == False %}
    

    好像没用。

    注意,我特别想检查它是否有Python值 False . 此变量也可以是空数组,即 我想查的东西。

    10 回复  |  直到 14 年前
        1
  •  28
  •   Martin    7 年前

    姜戈1.10 (release notes) 添加了 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版开始 (release notes) 模板引擎解释 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'
    
        2
  •  34
  •   Bialecki    13 年前

    对于后代,我有一些 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 .

        3
  •  25
  •   Zubair Afzal    13 年前

    我想这对你有用:

    {% if not myvar %}
    
        4
  •  23
  •   Gabriel Hurley    14 年前

    您可以编写一个自定义模板筛选器,在六行代码中完成此操作:

    from django.template import Library
    
    register = Library()
    
    @register.filter
    def is_false(arg): 
        return arg is False
    

    然后在模板中:

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

    当然,您可以使模板标记更通用。。。但这特别适合你的需要;-)

        5
  •  9
  •   Marvin W    11 年前

    在旧版本中,您只能使用 如果相等 如果不相等

    {% 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“阿德里安”%} ... {%endifequal%} ifequal标记的另一种选择是使用if标记和==运算符。

    如果不相等 就像ifequal一样,只是它测试两个参数不相等。

    ifnotequal标记的另一种选择是使用if标记和!=操作员。

    但是,现在我们可以很容易地使用if/else

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

        6
  •  5
  •   Ian Schneider    12 年前

    只是又碰到了这个问题(我确定我以前遇到过,并提出了一个不太令人满意的解决方案)。

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

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

    或者如果你更喜欢兴奋的话。。。

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

    不管怎样,这都处理了你不关心 None (在if块中求值为False)或 True 案例。

        7
  •  4
  •   dr jimbob    14 年前

    我以前遇到过这个问题,我通过嵌套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的字符串/数组被识别为真。

    您还可以在上下文中包含一个变量false_list=[false,],然后执行

    {% if some_bool in false_list %}False {% endif %}
    
        8
  •  4
  •   mwjackson    11 年前

    看看 yesno 帮手

    如:

    {{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
    
        9
  •  3
  •   Danimal    6 年前

    我刚刚想出了以下在Django 1.8中看起来不错的方法

    Try this而不是value不是False:

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

    试试这个而不是值为真:

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

    除非你真的搞砸了 代表 使值看起来像布尔值的方法我认为这应该给您一个足够坚定的保证,即值是真是假。

        10
  •  2
  •   Mike DeSimone    14 年前

    这比在模板中签入Python(即视图代码)要容易得多,因为Python代码很简单:

    myvar is False
    

    说明:

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

    模板级别的问题是 if 不解析 is (尽管它确实解析了 in ). 另外,如果您不介意,可以尝试修补对 在模板引擎中;基于 == .