Django templates: If false?

后端 未结 10 1098
灰色年华
灰色年华 2020-12-23 14:43

How do I check if a variable is False using Django template syntax?

{% if myvar == False %}

Doesn\'t seem to work.

相关标签:
10条回答
  • 2020-12-23 14:52

    I have had this issue before, which I solved by nested if statements first checking for none type separately.

    {% if object.some_bool == None %}Empty
    {% else %}{% if not object.some_bool %}False{% else %}True{% endif %}{% endif %}
    

    If you only want to test if its false, then just

    {% if some_bool == None %}{% else %}{% if not some_bool %}False{% endif %}{% endif %}
    

    EDIT: This seems to work.

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

    Now zero-length arrays are recognized as such; None types as None types; falses as False; Trues as trues; strings/arrays above length 0 as true.

    You could also include in the Context a variable false_list = [False,] and then do

    {% if some_bool in false_list %}False {% endif %}
    
    0 讨论(0)
  • 2020-12-23 14:52

    This is far easier to check in Python (i.e. your view code) than in the template, because the Python code is simply:

    myvar is False
    

    Illustrating:

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

    The problem at the template level is that the template if doesn't parse is (though it does parse in). Also, if you don't mind it, you could try to patch support for is into the template engine; base it on the code for ==.

    0 讨论(0)
  • 2020-12-23 14:53

    I've just come up with the following which is looking good in Django 1.8

    Try this instead of value is not False:

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

    Try this instead of value is True:

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

    unless you've been really messing with repr methods to make value look like a boolean I reckon this should give you a firm enough assurance that value is True or False.

    0 讨论(0)
  • 2020-12-23 14:54

    I think this will work for you:

    {% if not myvar %}
    
    0 讨论(0)
  • 2020-12-23 15:06

    Django 1.10 (release notes) added the is and is not comparison operators to the if tag. This change makes identity testing in a template pretty straightforward.

    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'
    

    If You are using an older Django then as of version 1.5 (release notes) the template engine interprets True, False and None as the corresponding Python objects.

    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'
    

    Although it does not work the way one might expect.

    In[10]: compare_zero = Template("{% if zero == False %}0 == False{% endif %}")
    In[11]: compare_zero.render(context)
    Out[11]: u'0 == False'
    
    0 讨论(0)
  • 2020-12-23 15:06

    For posterity, I have a few NullBooleanFields and here's what I do:

    To check if it's True:

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

    To check if it's False (note this works because there's only 3 values -- True/False/None):

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

    To check if it's None:

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

    I'm not sure why, but I can't do variable == False, but I can do variable == None.

    0 讨论(0)
提交回复
热议问题