Variable de modèle Jinja2 si Aucun Objet défini une valeur par défaut

146

Comment faire par défaut une variable dans jijna2 sur "" si l'objet est None au lieu de faire quelque chose comme ça?

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

Donc, si l'objet p est None, je veux par défaut les valeurs de p (prénom et nom) sur "". Fondamentalement

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

Erreur de réception:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'
mcd
la source
1
Rendez la fonction qui a renvoyé la valeur de pne jamais retourner None. Au lieu de cela, Nonela fonction doit renvoyer un objet proxy qui a la même structure qu'un objet réel mais qui est chargé avec les valeurs par défaut souhaitées.
Miguel du
J'utilise ceci, et mon problème a été résolu: {% if p! = None%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia

Réponses:

243

Utilisez la nonefonction intégrée ( http://jinja.pocoo.org/docs/templates/#none ):

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

ou

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

ou si vous avez besoin d'une chaîne vide:

{{ p.User['first_name'] if p != None }}
tbicr
la source
19
Notez les minuscules nonedans la réponse. Mon problème a été résolu après avoir corrigé le cas de None.
harperville le
127
{{p.User['first_name'] or 'My default string'}}
Torindo
la source
71

Selon la documentation, vous pouvez simplement faire:

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

Cause Nonecasts Falsedans un contexte booléen.


Mise à jour : comme Lindes l'a mentionné, cela ne fonctionne que pour les types de données simples.

Mitenka
la source
5
Cela fonctionne pour une variable simple, mais pas pour cette question où vous cherchez à extraire un champ d'un champ plus complexe. Je voterais contre cela, car ce n'est pas une bonne réponse à la question initiale ... et pourtant, en même temps, connaître defaultest exactement ce dont j'avais besoin pour mon cas particulier, donc ... simplement ne pas voter. (Une modification de cette réponse pourrait bien lui valoir un vote positif, sauf que je pense que c'est probablement difficile à appliquer defaultà cette situation)
Lindes
32

En plus d'autres réponses, on peut écrire autre chose si la variable est None comme ceci:

{{ variable or '' }}
Ivan Bryzzhin
la source
3
Je suis étonné de cette simplicité! Python x or yest if x is false, then y, else x. Voir: 5.2. Opérations booléennes - et, ou, pas
kenjiuno
11

En suivant ce document, vous pouvez le faire de cette façon:

{{ p.User['first_name']|default('NONE') }}
pawel7318
la source
8
Je ne pense pas - le filtre de modèle "par défaut" renvoie la valeur par défaut si la valeur est indéfinie / manquante.
codeape
A travaillé pour moi lors de l'utilisation d'ansible. Cela a rendu les choses plus claires: stackoverflow.com/q/28885184/1005215
Nehal J Wani
1
Si p est défini. Mais si P n'est pas défini, cela ne fonctionne pas
dalore
5

Pour éviter de lancer une exception lorsque "p" ou "p.User" vaut None, vous pouvez utiliser:

{{ (p and p.User and p.User['first_name']) or "default_value" }}
Sous
la source
4
C'est le seul qui a fonctionné pour moi étant donné que ma variable était profondément enfouie dans un dict.
Craicerjack
Cela aide à nettoyer certains autres avec beaucoup de logique.
eagle33322
1

Comme autre solution (un peu similaire à certaines précédentes):

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

Notez que la dernière variable (p.User ['first_name']) n'a pas le if definedtest après elle.

Apollon
la source
0

Je définis généralement une nvlfonction, et je la mets dans globalset 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

Utilisation dans un modèle:

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

// or 

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