goh
goh

Reputation: 29511

django template if condition

got a question here.

I have the following

{% if form.tpl.yes_no_required == True  %}
             <!-- path 1 -->
{% else %}
    {% if form.tpl.yes_no_required == False %}

        <!-- path 2 -->
    {% endif %} 
{% endif %}

The value for form.tpl.yes_no_required is None, but I was routed to path 2. Can anyone please explain why is this so? EDIT: if the value is none, i do not want it display anything.

Upvotes: 6

Views: 38933

Answers (2)

Jason Culverhouse
Jason Culverhouse

Reputation: 396

You can't use the template language to test against what you think are constants, the parser is actually testing 2 "literals".

The parser tests for 2 literals with names 'None' and 'False'. When parser tries to resolve these in the context a VariableDoesNotExist exception is thrown and both objects resolve to the python value None and None == None.

from django.template import Context, Template
t = Template("{% if None == False %} not what you think {% endif %}")
c = Context({"foo": foo() })

prints u' not what you think '

c = Context({'None':None})
t.render(c)

prints u' not what you think '

c = Context({'None':None, 'False':False})
t.render(c)

prints u''

Upvotes: 14

Mohammad Efazati
Mohammad Efazati

Reputation: 4910

None != False None != True also ... do some things like this for none item

{% if form.tpl.yes_no_required  %}
             <!-- path 1 -->
{% else %}
    {% if not form.tpl.yes_no_required %}

        <!-- path 2 -->
    {% endif %} 
{% endif %}

Upvotes: 1

Related Questions