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'

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

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


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.


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


11

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

{{ p.User['first_name']|default('NONE') }}

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

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.


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>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.