En Jinja2, ¿cómo prueba si una variable no está definida?

190

Al convertirme de Django, estoy acostumbrado a hacer algo como esto:

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

y hacer que funcione si no puse var1 en el contexto. Jinja2 me da un error indefinido. ¿Hay una manera fácil de decir {% if var1 == None %}o similar?

freyley
fuente

Respuestas:

333

De la documentación del diseñador de plantillas Jinja2 :

{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}
Garrett
fuente
Creo que este es el caso, pero mis términos de búsqueda a menudo no reflejan eso.
dannyman
17
Además, puede usar {% if variable is not defined %}para probar el inverso.
pbaranay
@dannyman Desde 0.2.0
Samuel Harmer
1
{% if variable is defined and variable %}también verificaría el vacío
Vivek
32

{% if variable is defined %} es cierto si la variable es None .

Como not is Noneno está permitido, eso significa que

{% if variable != None %}

Es realmente tu única opción.

Carsten Agger
fuente
Si variablesiempre se evalúa Truecuando no es Ninguno, {% if variable != None %}es equivalente a {% if variable %}.
azalea
Si desea verificar el Noneuso de minúsculasnone {% if variable is not none %}
Felipe Alvarez
14

También podría definir una variable en una plantilla jinja2 como esta:

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

Y luego puedes usarlo así:

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

De lo contrario (si no usaría {% set step = 1 %}), el código superior arrojaría:

UndefinedError: 'step' is undefined
czerasz
fuente
12

En la configuración del entorno, tuvimos undefined = StrictUndefined, lo que evitó que los valores indefinidos se establecieran en cualquier cosa. Esto lo solucionó:

from jinja2 import Undefined
JINJA2_ENVIRONMENT_OPTIONS = { 'undefined' : Undefined }
freyley
fuente
5

Considere usar un filtro predeterminado si es lo que necesita. Por ejemplo:

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

o use más valores de respaldo con uno "codificado" al final como:

{% set connectTimeout = config.stackowerflow.connect.timeout | default(config.stackowerflow.timeout) | default(config.timeout) | default(42) -%}
Lubomir Varga
fuente
1

{% if variable is defined %} funciona para verificar si algo no está definido.

Puede salirse con la suya {% if not var1 %}si predetermina sus variables a False, por ejemplo

class MainHandler(BaseHandler):
    def get(self):
        var1 = self.request.get('var1', False)
Lee Penkman
fuente