Variabile del modello Jinja2 se Nessuno oggetto imposta un valore predefinito


146

Come rendere una variabile in jijna2 predefinita su "" se oggetto è Nessuno invece di fare qualcosa del genere?

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

Quindi, se l'oggetto p è Nessuno, voglio impostare i valori di p (nome e cognome) su "". Fondamentalmente

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

Errore durante la ricezione:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'

1
Rendere la funzione che ha restituito il valore di pnon tornare più None. Invece della Nonefunzione dovrebbe restituire un oggetto proxy che ha la stessa struttura di un oggetto reale ma viene caricato con i valori predefiniti desiderati.
Miguel,

Lo uso e il mio problema è stato risolto: {% if p! = None%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia,

Risposte:


242

Utilizzare la nonefunzione integrata ( 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 se hai bisogno di una stringa vuota:

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

19
Nota la lettera minuscola nonenella risposta. Il mio problema è stato risolto dopo aver corretto il caso di None.
Harperville,

127
{{p.User['first_name'] or 'My default string'}}

70

Secondo i documenti puoi semplicemente fare:

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

Causa Nonecast Falsein un contesto booleano.


Aggiornamento : come indicato da Lindes, funziona solo per tipi di dati semplici.


5
Funziona per una semplice variabile, ma non per questa domanda in cui stai cercando di afferrare un campo da uno più complesso. Vorrei sottovalutare questo, dal momento che non è una buona risposta alla domanda originale ... eppure allo stesso tempo, conoscere defaultè esattamente ciò di cui avevo bisogno per il mio caso particolare, quindi ... semplicemente non votare. (Una modifica a questa risposta potrebbe far guadagnare un voto positivo, tranne per il fatto che penso che sia difficile applicare defaulta questa situazione)
lind



5

Per evitare di generare un'eccezione mentre "p" o "p.User" è Nessuno, è possibile utilizzare:

{{ (p and p.User and p.User['first_name']) or "default_value" }}

4
Questo è l'unico che ha funzionato per me dato che la mia variabile è stata sepolta in profondità in un dict.
Craicerjack il

Questo aiuta a ripulire alcuni altri con molta logica.
eagle33322,

1

Come altra soluzione (in qualche modo simile ad alcune precedenti):

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

Nota che l'ultima variabile (p.User ['first_name']) non ha il if definedtest dopo di essa.


0

Di solito definisco una nvlfunzione e la inserisco in globalse 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

Utilizzo in un modello:

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

// or 

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.