Apa yang setara dengan "tidak ada" dalam template django?

102

Saya ingin melihat apakah sebuah field / variabel tidak ada dalam template Django. Apa sintaks yang benar untuk itu?

Inilah yang saya miliki saat ini:

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

Pada contoh di atas, apa yang akan saya gunakan untuk mengganti "null"?

goelv
sumber

Jawaban:

132

None, False and Truesemua tersedia dalam tag dan filter template. None, False, string kosong ( '', "", """""") dan daftar kosong / tupel semuanya dievaluasi Falseketika dievaluasi oleh if, sehingga Anda dapat melakukannya dengan mudah

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

Petunjuk: @fabiocerqueira benar, serahkan logika pada model, batasi template untuk menjadi satu-satunya lapisan presentasi dan hitung hal-hal seperti itu dalam model Anda. Sebuah contoh:

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

Semoga ini membantu :)

Gerard
sumber
Saya baru saja mencoba meneruskan None sebagai parameter ke tag {% cache%} dan mengetahui bahwa itu tidak tersedia. Sibuk mengerjakan ini.
tobych
7
{% if profile.user.first_name is None %}menyebabkan kesalahan sintaks pada cetakan Django.
Rockallite
1
Petunjuk Anda mencampurkan presentasi dan logika dengan meletakkan HTML dalam model Anda, melakukan hal yang berlawanan dengan apa yang Anda coba ajarkan. Bagaimana jika mengembalikan None jika tidak ada nama (perilaku logis untuk model data) dan kemudian menggunakan default_if_nonefilter di template?
jbg
@ JasperBryant-Greene Anda benar! baru saja diperbarui. Tangkap yang bagus! Terima kasih!
Gerard
67

Anda juga dapat menggunakan templat bawaan lainnya default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Babacar Gningue
sumber
1
Ada ide bagaimana menggunakan ini dengan filter lain seperti tanggal? Misalnya, apakah mungkin untuk menampilkan "T / A" jika tanggal tidak ada tetapi sebaliknya memformatnya? Suka: {{post.pub_date | default_if_none: "T / A" | date: "Ymd"}}?
Andreas Bergström
@ AndreasBergström Dalam kasus Anda, Anda mendaftar dateterlebih dahulu. Jika terjadi kesalahan, itu akan mengembalikan Tidak ada. Kemudian Anda melamar default_if_none.
pertahanan
Versi Django apakah yang dibawa ini?
Pengguna
10

isoperator: Baru di Django 1.10

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

Lihatlah pembantu yesno

Misalnya:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
mwjackson
sumber
4

{% if profile.user.first_name %}bekerja (dengan asumsi Anda juga tidak ingin menerima '').

ifPython di memperlakukan umum None, False, '', [], {}, ... semua sebagai palsu.

Dougal
sumber
3

Anda juga dapat menggunakan filter template bawaan default :

Jika nilai terevaluasi menjadi False (misalnya Tidak Ada, string kosong, 0, Salah); default "-" ditampilkan.

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

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

Louis
sumber
1
default_if_none mungkin akan menjadi opsi yang lebih baik.
dbn
0

Anda bisa mencoba ini:

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

Dengan cara ini, Anda pada dasarnya memeriksa untuk melihat apakah bidang formulir first_namememiliki nilai yang terkait dengannya. Lihat {{ field.value }}dalam Perulangan pada bidang formulir di Dokumentasi Django .

Saya menggunakan Django 3.0.

claypooj
sumber