web-dev-qa-db-fra.com

Variable de modèle Jinja2 si Aucun objet définit une valeur par défaut

Comment rendre une variable dans jijna2 par défaut à "" 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 que les valeurs de p (prénom et nom) soient définies par défaut sur "". Fondamentalement nvl (p.Utilisateur [prenom '], "")

Erreur lors de la réception: Erreur: jinja2.exceptions.UndefinedError UndefinedError: "Aucun" n'a pas d'attribut "Utilisateur".

119
mcd

Utilisez la fonction intégrée none ( 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 }}
193
tbicr
{{p.User['first_name'] or 'My default string'}}
106
Torindo

Selon docs vous pouvez simplement faire:

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

Cause None transforme en False dans un contexte booléen.


Update : Comme mentionné par Lindes, cela ne fonctionne que pour des types de données simples.

56
mitenka

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

{{ variable or '' }}
22
Ivan Bryzzhin

Après cette doc vous pouvez le faire de cette façon:

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

Pour éviter de lever une exception alors que "p" ou "p.User" vaut Aucun, vous pouvez utiliser:

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

Autre solution (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 ['prenom']) n'a pas le test if defined après.

1
Apollo

Je définis habituellement une fonction nvl et la mets dans globals et 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 template:

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

// or 

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

À partir de la version 2.8, vous pouvez simplement utiliser:

{{ p.User['first_name'] }}

Voir https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html#jinja-undefined-values

0
Apollo