Variable de plantilla Jinja2 si Ninguno Objeto establece un valor predeterminado

146

¿Cómo hacer que una variable en jijna2 sea "" predeterminada si el objeto es Ninguno en lugar de hacer algo como esto?

      {% if p %}   
        {{ p.User['first_name']}}
      {% else %}
        NONE
      {%endif %}

Entonces, si el objeto p es Ninguno, quiero predeterminar los valores de p (nombre y apellido) a "". Básicamente

nvl(p.User[first_name'], "")

Error al recibir:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'
mcd
fuente
1
Realice la función que devolvió el valor de pnunca volver None. En lugar de Nonela función, debería devolver un objeto proxy que tenga la misma estructura que un objeto real pero que esté cargado con los valores predeterminados que desee.
Miguel
Lo uso y mi problema se resolvió: {% if p! = None%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia

Respuestas:

242

Use la nonefunción integrada ( http://jinja.pocoo.org/docs/templates/#none ):

{% if p is not none %}   
    {{ p.User['first_name'] }}
{% else %}
    NONE
{%endif %}

o

{{ p.User['first_name'] if p != None else 'NONE' }}

o si necesitas una cadena vacía:

{{ p.User['first_name'] if p != None }}
tbicr
fuente
19
Observe las minúsculas noneen la respuesta. Mi problema se resolvió después de corregir el caso de None.
Harperville
127
{{p.User['first_name'] or 'My default string'}}
Torindo
fuente
70

Según los documentos , puedes hacer:

{{ p|default('', true) }}

Causa Noneconversiones Falseen contexto booleano.


Actualización : como se mencionó en lindes, funciona solo para tipos de datos simples.

mitenka
fuente
55
Esto funciona para una variable simple, pero no para esta pregunta en la que está buscando obtener un campo de uno más complejo. Lo rechazaría, ya que no es una buena respuesta a la pregunta original ... y al mismo tiempo, saber sobre eso defaultes exactamente lo que necesitaba para mi caso particular, así que ... simplemente no votar. (Una edición de esta respuesta podría ganar un voto positivo, excepto que creo que es difícil aplicarla defaulta esta situación)
lindes
31

Además de otras respuestas, uno puede escribir algo más si la variable es Ninguna como esta:

{{ variable or '' }}
Ivan Bryzzhin
fuente
3
Estoy sorprendido de esta simplicidad! Python x or yes if x is false, then y, else x. Ver: 5.2. Operaciones booleanas - y, o no
kenjiuno
10

Después de este documento , puede hacerlo de esa manera:

{{ p.User['first_name']|default('NONE') }}
pawel7318
fuente
8
No lo creo: el filtro de plantilla "predeterminado" devuelve el valor predeterminado si el valor no está definido / falta.
codeape
Funcionó para mí cuando uso ansible. Esto lo dejó más claro: stackoverflow.com/q/28885184/1005215
Nehal J Wani
1
Si se define p. Pero si P no está definido, no funciona
atrévete el
5

Para evitar lanzar una excepción mientras "p" o "p.User" es None, puede usar:

{{ (p and p.User and p.User['first_name']) or "default_value" }}
Sub
fuente
44
Este es el único que funcionó para mí dado que mi variable fue enterrada profundamente en un dict.
Craicerjack
Esto ayuda a limpiar algunos otros con mucha lógica.
eagle33322
1

Como otra solución (algo similar a algunas anteriores):

{{ ( p is defined and p.User is defined and p.User['first_name'] ) |default("NONE", True) }}

Tenga en cuenta que la última variable (p.User ['first_name']) no tiene la if definedprueba después.

Apolo
fuente
0

Normalmente defino una nvlfunción y la pongo en globalsy filters.

def nvl(*args):
    for item in args:
        if item is not None:
            return item
    return None

app.jinja_env.globals['nvl'] = nvl
app.jinja_env.filters['nvl'] = nvl

Uso en una plantilla:

<span>Welcome {{ nvl(person.nick, person.name, 'Anonymous') }}<span>

// or 

<span>Welcome {{ person.nick | nvl(person.name, 'Anonymous') }}<span>
Tamas Hegedus
fuente