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'

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

19
Observe las minúsculas noneen la respuesta. Mi problema se resolvió después de corregir el caso de None.
Harperville


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.


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



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" }}

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.


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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.