283

Converting from Django, I'm used to doing something like this:

{% if not var1 %} {% endif %}

and having it work if I didn't put var1 into the context. Jinja2 gives me an undefined error. Is there an easy way to say {% if var1 == None %} or similar?

Paolo Casciello
  • 7,982
  • 1
  • 43
  • 42
freyley
  • 4,145
  • 3
  • 20
  • 25

9 Answers9

482

From the Jinja2 template designer documentation:

{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}
Day
  • 9,465
  • 6
  • 57
  • 93
Garrett
  • 47,045
  • 6
  • 61
  • 50
55

{% if variable is defined %} is true if the variable is None.

Since not is None is not allowed, that means that

{% if variable != None %}

is really your only option.

Community
  • 1
  • 1
Carsten Agger
  • 551
  • 4
  • 2
21

You could also define a variable in a jinja2 template like this:

{% if step is not defined %}
{% set step = 1 %}
{% endif %}

And then You can use it like this:

{% if step == 1 %}
<div class="col-xs-3 bs-wizard-step active">
{% elif step > 1 %}
<div class="col-xs-3 bs-wizard-step complete">
{% else %}
<div class="col-xs-3 bs-wizard-step disabled">
{% endif %}

Otherwise (if You wouldn't use {% set step = 1 %}) the upper code would throw:

UndefinedError: 'step' is undefined
czerasz
  • 13,682
  • 9
  • 53
  • 63
12

In the Environment setup, we had undefined = StrictUndefined, which prevented undefined values from being set to anything. This fixed it:

from jinja2 import Undefined
JINJA2_ENVIRONMENT_OPTIONS = { 'undefined' : Undefined }
Nathan
  • 4,009
  • 2
  • 20
  • 21
freyley
  • 4,145
  • 3
  • 20
  • 25
8

Consider using default filter if it is what you need. For example:

{% set host = jabber.host | default(default.host) -%}

or use more fallback values with "hardcoded" one at the end like:

{% set connectTimeout = config.stackowerflow.connect.timeout | default(config.stackowerflow.timeout) | default(config.timeout) | default(42) -%}
Lubomir Varga
  • 109
  • 2
  • 8
7

You can use kind of Jinja Elvis operator

{{ 'OK' if variable is defined else 'N/A' }}

or additionally check emptiness

{{ 'OK' if (variable is defined and variable) else 'N/A' }}

Jinja templates - Template Designer Documentation

Michal Zmuda
  • 5,381
  • 3
  • 43
  • 39
1

{% if variable is defined %} works to check if something is undefined.

You can get away with using {% if not var1 %} if you default your variables to False eg

class MainHandler(BaseHandler):
    def get(self):
        var1 = self.request.get('var1', False)
lee penkman
  • 1,160
  • 15
  • 19
1

I had an issue like this in Ansible. Ended up having to do a test on both @Garret and @Carsten / @azalea answers, so:

{% if variable is defined and variable %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined or is falsy
{% endif %}
velis
  • 8,747
  • 4
  • 44
  • 64
-3

You can do this :

- debug: 
    msg: "Executed only if variable is defined"
  when:
    - variable is defined