Hiçbiri Nesnesi varsayılan bir değer ayarlarsa Jinja2 şablon değişkeni


146

Böyle bir şey yapmak yerine nesne None ise jijna2'de bir değişkeni varsayılan olarak "" nasıl yapabilirim?

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

P nesnesi Yok ise p (first_name ve last_name) değerlerini "" olarak varsayılan yapmak istiyorum. temel olarak

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

Alma hatası:

Error:  jinja2.exceptions.UndefinedError
    UndefinedError: 'None' has no attribute 'User'

1
pHiçbir zaman döndürülmeyen değeri döndüren işlevi yapın None. Noneİşlev yerine, gerçek bir nesneyle aynı yapıya sahip olan bir proxy nesnesini döndürmelidir, ancak istediğiniz varsayılan değerlerle yüklenir.
Miguel

Bunu kullanıyorum ve sorunum çözüldü: {% if p! = None%} {{p.User ['first_name']}} {% endif%}
Mona Mohamadinia

Yanıtlar:


243

noneYerleşik işlevi kullanın ( http://jinja.pocoo.org/docs/templates/#none ):

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

veya

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

veya boş bir dizeye ihtiyacınız varsa:

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

19
Cevaptaki küçük harfe dikkat edin none. Hiçbiri'nin davasını düzelttikten sonra sorunum çözüldü.
harperville


71

Dokümanlara göre şunları yapabilirsiniz:

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

Nedeni boole bağlamında Noneyayınlar False.


Güncelleme : Lindindes'in belirttiği gibi, sadece basit veri türleri için çalışır.


5
Bu basit bir değişken için geçerlidir, ancak daha karmaşık bir alandan bir alan kapmak istediğiniz bu soru için geçerli değildir. Orijinal soruya iyi bir cevap olmadığı için bunu küçümseyeceğim ... ve aynı zamanda, defaultbenim durumum için tam olarak ihtiyacım olan şey olduğunu bilmek , bu yüzden ... oy vermemek. (Ben uygulanma ihtimali zor olduğunu düşünüyorum dışında bu cevaba Bir düzenleme de, o bir upvote kazanmak olabilir defaultbu duruma)
Lindes



5

"P" veya "p.User" Yokken istisna atmaktan kaçınmak için şunları kullanabilirsiniz:

{{ (p and p.User and p.User['first_name']) or "default_value" }}

4
Değişkenim bir dikte içine gömüldüğünde benim için çalışan tek şey bu.
Craicerjack

Bu, bazılarını mantıkla temizlemeye yardımcı olur.
eagle33322

1

Başka bir çözüm olarak (bir öncekine benzer):

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

Son değişkenin (p.User ['first_name']) if definedtestten sonra olmadığını unutmayın.


0

Genellikle bir tanımlayan nvlfonksiyon ve koyun globalsve 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

Şablonda kullanım:

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

// or 

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.