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'

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

19
Perhatikan huruf kecil nonedalam jawabannya. Masalah saya terpecahkan setelah saya memperbaiki kasus None.
Harperville


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.


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


10

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

{{ p.User['first_name']|default('NONE') }}

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

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.


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>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.