Variabel template Jinja2 jika Tidak Ada Objek menetapkan nilai default

146

Bagaimana cara membuat variabel dalam jijna2 default ke "" jika objeknya adalah Tidak ada daripada melakukan sesuatu seperti ini?

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

Jadi, jika objek p adalah Tidak Ada Saya ingin default nilai p (first_name dan last_name) menjadi "". Pada dasarnya

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

Kesalahan menerima:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'
mcd
sumber
1
Buat fungsi yang mengembalikan nilai ptidak pernah kembali None. Alih-alih Nonefungsi harus mengembalikan objek proxy yang memiliki struktur yang sama dengan objek nyata tetapi dimuat dengan nilai-nilai default yang Anda inginkan.
Miguel
Saya menggunakan ini, dan masalah saya terpecahkan: {% if p! = Tidak ada%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia

Jawaban:

242

Gunakan nonefungsi builtin ( http://jinja.pocoo.org/docs/templates/#none ):

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

atau

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

atau jika Anda membutuhkan string kosong:

{{ p.User['first_name'] if p != None }}
tbicr
sumber
19
Perhatikan huruf kecil nonedalam jawabannya. Masalah saya terpecahkan setelah saya memperbaiki kasus None.
Harperville
127
{{p.User['first_name'] or 'My default string'}}
Torindo
sumber
70

Menurut dokumen yang bisa Anda lakukan:

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

Menyebabkan Nonegips Falsedalam konteks boolean.


Pembaruan : Seperti yang disebutkan lindes, ini hanya berfungsi untuk tipe data sederhana.

mitenka
sumber
5
Ini berfungsi untuk variabel sederhana, tetapi tidak untuk pertanyaan ini di mana Anda ingin mengambil bidang dari yang lebih kompleks. Saya akan memilih ini, karena itu bukan jawaban yang baik untuk pertanyaan asli ... namun pada saat yang sama, mengetahui tentang defaultapa yang saya butuhkan untuk kasus khusus saya, jadi ... hanya tidak memilih. (Hasil edit untuk jawaban ini mungkin dapat membuatnya mendapat upvote, kecuali bahwa saya pikir ini mungkin sulit diterapkan defaultpada situasi ini)
lindes
31

Sebagai tambahan untuk jawaban lain, seseorang dapat menulis sesuatu yang lain jika variabelnya adalah Tidak seperti ini:

{{ variable or '' }}
Ivan Bryzzhin
sumber
3
Saya kagum dengan kesederhanaan ini! Python x or yadalah if x is false, then y, else x. Lihat: 5.2. Operasi Boolean - dan, atau, tidak
kenjiuno
10

Dengan mengikuti dokumen ini, Anda dapat melakukannya dengan cara ini:

{{ p.User['first_name']|default('NONE') }}
pawel7318
sumber
8
Saya rasa tidak - filter "default" template mengembalikan nilai default jika nilainya tidak terdefinisi / hilang.
codeape
Bekerja untuk saya saat menggunakan ansible. Ini membuatnya lebih jelas: stackoverflow.com/q/28885184/1005215
Nehal J Wani
1
Jika p didefinisikan. Tetapi jika P tidak didefinisikan, itu tidak berfungsi
dalore
5

Untuk menghindari melemparkan pengecualian saat "p" atau "p.Pengguna" adalah Tidak Ada, Anda dapat menggunakan:

{{ (p and p.User and p.User['first_name']) or "default_value" }}
Sub
sumber
4
Ini adalah satu-satunya yang bekerja untuk saya mengingat variabel saya terkubur dalam-dalam.
Craicerjack
Ini membantu membersihkan beberapa orang lain dengan banyak logika.
eagle33322
1

Sebagai solusi lain (agak mirip dengan yang sebelumnya):

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

Perhatikan variabel terakhir (p.Pengguna ['first_name']) tidak memiliki if definedtes setelah itu.

Apollo
sumber
0

Saya biasanya mendefinisikan suatu nvlfungsi, dan memasukkannya ke dalam globalsdan 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

Penggunaan dalam templat:

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

// or 

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