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'

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

19
Beachten Sie den Kleinbuchstaben nonein der Antwort. Mein Problem wurde gelöst, nachdem ich den Fall von None korrigiert hatte.
Harperville


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.


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



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

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.


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>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.