Was ist das Äquivalent von "keine" in Django-Vorlagen?

101

Ich möchte sehen, ob ein Feld / eine Variable in einer Django-Vorlage keines ist. Was ist die richtige Syntax dafür?

Folgendes habe ich derzeit:

{% if profile.user.first_name is null %}
  <p> -- </p>
{% elif %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif%}

Was würde ich im obigen Beispiel verwenden, um "null" zu ersetzen?

goelv
quelle

Antworten:

131

None, False and TrueAlle sind in Vorlagen-Tags und Filtern verfügbar. None, False, die leere Zeichenfolge ( '', "", """""") und leere Listen / Tupel werden alle ausgewertet, Falsewenn sie von ausgewertet werden if, sodass Sie dies problemlos tun können

{% if profile.user.first_name == None %}
{% if not profile.user.first_name %}

Ein Hinweis: @fabiocerqueira ist richtig, überlassen Sie die Logik den Modellen, beschränken Sie Vorlagen auf die einzige Präsentationsebene und berechnen Sie solche Dinge in Ihrem Modell. Ein Beispiel:

# someapp/models.py
class UserProfile(models.Model):
    user = models.OneToOneField('auth.User')
    # other fields

    def get_full_name(self):
        if not self.user.first_name:
            return
        return ' '.join([self.user.first_name, self.user.last_name])

# template
{{ user.get_profile.get_full_name }}

Hoffe das hilft :)

Gerard
quelle
Ich habe gerade versucht, None als Parameter an das Tag {% cache%} zu übergeben und festgestellt, dass es nicht verfügbar ist. Beschäftigt damit.
Tobych
7
{% if profile.user.first_name is None %}verursacht Syntaxfehler in der Django-Vorlage.
Rockallite
1
Ihr Hinweis mischt Präsentation und Logik, indem Sie HTML in Ihr Modell einfügen und genau das Gegenteil von dem tun, was Sie vermitteln möchten. Wie wäre es, wenn Sie None zurückgeben, wenn kein Name vorhanden ist (logisches Verhalten für ein Datenmodell), und dann den default_if_noneFilter in der Vorlage verwenden?
jbg
@ JasperBryant-Greene du hast recht! gerade aktualisiert. Guter Fangmann! Vielen Dank!
Gerard
66

Sie können auch eine andere integrierte Vorlage verwenden default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Babacar Gningue
quelle
1
Irgendeine Idee, wie man dies mit anderen Filtern wie Datum verwendet? Ist es beispielsweise möglich, "N / A" anzuzeigen, wenn ein Datum keines ist, es aber anderweitig formatiert? Wie: {{post.pub_date | default_if_none: "N / A" | Datum: "Ymd"}}?
Andreas Bergström
@ AndreasBergström In deinem Fall bewirbst du dich datezuerst. Wenn ein Fehler auftritt, wird None zurückgegeben. Dann bewerben Sie sich default_if_none.
Defance
Welche Version von Django wurde eingeführt?
Benutzer
10

isBetreiber: Neu in Django 1.10

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
user6763622
quelle
5

Schau dir den Yesno- Helfer an

Z.B:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
mwjackson
quelle
3

{% if profile.user.first_name %}funktioniert (vorausgesetzt, Sie möchten auch nicht akzeptieren '').

ifin Python im Allgemeinen behandelt None, False, '', [], {}, ... alle als falsch.

Dougal
quelle
2

Sie können auch den integrierten Vorlagenfilter verwenden default:

Wenn der Wert False ergibt (z. B. None, eine leere Zeichenfolge, 0, False); Das Standard "-" wird angezeigt.

{{ profile.user.first_name|default:"--" }}

Dokumentation: https://docs.djangoproject.com/de/dev/ref/templates/builtins/#default

Louis
quelle
1
default_if_none wäre wahrscheinlich eine bessere Option.
dbn
0

Sie könnten dies versuchen:

{% if not profile.user.first_name.value %}
  <p> -- </p>
{% else %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif %}

Auf diese Weise überprüfen Sie im Wesentlichen, ob dem Formularfeld first_nameein Wert zugeordnet ist. Siehe {{ field.value }}in Looping über die Felder des Formulars in Django Dokumentation .

Ich benutze Django 3.0.

Claypooj
quelle