Jinja2-Vorlagenvariable, wenn None Object einen Standardwert festgelegt hat

145

Wie mache ich eine Variable in jijna2 standardmäßig auf "", wenn das Objekt None ist, anstatt so etwas zu tun?

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

Wenn also Objekt p Keine ist, möchte ich die Werte von p (Vorname und Nachname) standardmäßig auf "" setzen. Grundsätzlich

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

Fehler beim Empfang:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'
mcd
quelle
1
Machen Sie die Funktion, die den Wert von pNever Return zurückgegeben hat None. Anstelle Noneder Funktion sollte ein Proxy-Objekt zurückgegeben werden, das dieselbe Struktur wie ein reales Objekt hat, jedoch mit den gewünschten Standardwerten geladen ist.
Miguel
Ich benutze dies und mein Problem wurde gelöst: {% if p! = None%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia

Antworten:

240

Verwenden Sie die noneintegrierte Funktion ( http://jinja.pocoo.org/docs/templates/#none ):

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

oder

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

oder wenn Sie eine leere Zeichenfolge benötigen:

{{ p.User['first_name'] if p != None }}
tbicr
quelle
19
Beachten Sie den Kleinbuchstaben nonein der Antwort. Mein Problem wurde gelöst, nachdem ich den Fall von None korrigiert hatte.
Harperville
127
{{p.User['first_name'] or 'My default string'}}
Torindo
quelle
70

Laut Dokumentation können Sie einfach Folgendes tun:

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

Ursache Nonewirft auf Falsein Booleschen Kontext.


Update : Wie bereits erwähnt, funktioniert es nur für einfache Datentypen.

Mitenka
quelle
5
Dies funktioniert für eine einfache Variable, jedoch nicht für diese Frage, bei der Sie ein Feld aus einem komplexeren herausgreifen möchten. Ich würde dies ablehnen, da es keine gute Antwort auf die ursprüngliche Frage ist ... und gleichzeitig ist das Wissen darüber defaultgenau das, was ich für meinen speziellen Fall brauchte, also ... einfach nicht abstimmen. (Eine Änderung dieser Antwort könnte durchaus eine positive Bewertung bringen, außer dass ich denke, dass es wahrscheinlich schwierig ist, sich defaultauf diese Situation zu
beziehen
31

Zusätzlich zu anderen Antworten kann man etwas anderes schreiben, wenn die Variable None wie folgt ist:

{{ variable or '' }}
Ivan Bryzzhin
quelle
3
Ich bin erstaunt über diese Einfachheit! Pythons x or yist if x is false, then y, else x. Siehe: 5.2. Boolesche Operationen - und oder nicht
Kenjiuno
10

Nach diesem Dokument können Sie diese auf diese Weise tun:

{{ p.User['first_name']|default('NONE') }}
pawel7318
quelle
8
Ich glaube nicht - der "Standard" -Vorlagenfilter gibt den Standardwert zurück, wenn der Wert undefiniert ist / fehlt.
Codeape
Arbeitete für mich bei der Verwendung von Ansible. Dies machte es klarer: stackoverflow.com/q/28885184/1005215
Nehal J Wani
1
Wenn p definiert ist. Aber wenn P nicht definiert ist, funktioniert es nicht
dalore
5

Um zu vermeiden, dass eine Ausnahme ausgelöst wird, während "p" oder "p.User" None ist, können Sie Folgendes verwenden:

{{ (p and p.User and p.User['first_name']) or "default_value" }}
Sub
quelle
4
Dies ist die einzige, die für mich funktioniert hat, da meine Variable tief in einem Diktat vergraben war.
Craicerjack
Dies hilft dabei, einige andere mit viel Logik zu bereinigen.
Eagle33322
1

Als eine andere Lösung (ähnlich wie bei einigen vorherigen):

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

Beachten Sie, dass die letzte Variable (p.User ['first_name']) keinen if definedTest danach hat.

Apollo
quelle
0

Normalerweise definiere ich eine nvlFunktion und setze sie in globalsund 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

Verwendung in einer Vorlage:

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

// or 

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