Jaki jest odpowiednik „none” w szablonach django?

103

Chcę zobaczyć, czy pole / zmienna nie ma w szablonie Django. Jaka jest poprawna składnia tego?

Oto, co obecnie mam:

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

W powyższym przykładzie, czego użyłbym, aby zamienić „null”?

goelv
źródło

Odpowiedzi:

134

None, False and Truewszystkie są dostępne w ramach tagów szablonów i filtrów. None, False, puste string ( '', "", """""") i puste listy / krotki są obliczane do Falsekiedy są oceniane przez if, więc możesz to łatwo zrobić

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

Wskazówka: @fabiocerqueira ma rację, pozostaw logikę modelom, ogranicz szablony do jedynej warstwy prezentacji i obliczaj takie rzeczy w swoim modelu. Przykład:

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

Mam nadzieję że to pomoże :)

Gerard
źródło
Właśnie próbowałem przekazać None jako parametr do tagu {% cache%} i dowiedziałem się, że nie jest on dostępny. Zajęty pracą nad tym.
tobych
7
{% if profile.user.first_name is None %}powoduje błąd składni w szablonie Django.
Rockallite
1
Twoja wskazówka miesza prezentację i logikę, umieszczając HTML w swoim modelu, robiąc dokładnie odwrotność tego, czego próbujesz nauczyć. Co powiesz na zwrócenie None, jeśli nie ma nazwy (logiczne zachowanie dla modelu danych), a następnie użycie default_if_nonefiltru w szablonie?
jbg
@ JasperBryant-Greene masz rację! właśnie zaktualizowany. Dobry chwyt! Dzięki!
Gerard
67

Możesz także użyć innego wbudowanego szablonu default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Babacar Gningue
źródło
1
Masz pomysł, jak używać tego z innymi filtrami, takimi jak data? Na przykład, czy można wyświetlić „nie dotyczy”, jeśli data jest „brak”, ale w inny sposób ją sformatować? Na przykład: {{post.pub_date | default_if_none: "N / A" | date: "Ymd"}}?
Andreas Bergström
@ AndreasBergström W Twoim przypadku najpierw aplikujesz date. Jeśli wystąpi jakikolwiek błąd, zwróci None. Następnie aplikujesz default_if_none.
defance
Jaka wersja Django została wprowadzona?
Użytkownik
10

isoperator: Nowość w Django 1.10

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
user6763622
źródło
5

Spójrz na pomocnika yesno

Na przykład:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
mwjackson
źródło
4

{% if profile.user.first_name %} działa (zakładając, że też nie chcesz zaakceptować '' ).

ifw Pythonie na ogół traktuje None, False, '', [], {}, ... wszystko jako fałszywe.

djowie
źródło
3

Możesz także użyć wbudowanego filtru szablonów default:

Jeśli wartość ma wartość False (np. None, pusty ciąg, 0, False); wyświetlany jest domyślny „-”.

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

Dokumentacja: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#default

Louis
źródło
1
default_if_none prawdopodobnie byłaby lepszą opcją.
dbn
0

Możesz spróbować tego:

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

W ten sposób zasadniczo sprawdzasz, czy pole formularza first_namema skojarzoną z nim wartość. Zobacz {{ field.value }}w Pętle nad polami formularza w dokumentacji Django .

Używam Django 3.0.

claypooj
źródło