5 Soru: Jinja2'de "None" çıktısını dizge olarak göster

tarafından oluşturulan soru Sun, Aug 31, 2014 12:00 AM

Jinja2'yi, değer "None" olduğunda None yazdırmama konusunda nasıl ikna edebilirim?

Bir sözlükte çok sayıda giriş var ve farklı anahtar kelimeler için özel durumlar yerine, her şeyi tek bir döngü halinde yazdırmak istiyorum. None değerine sahipsem (NoneType dizesi değil), "None" dizisi şablon oluşturma sonuçlarına eklenir.

Kullanarak bastırmayı denemek  {{ value or '' }}, sıfır değerini de değiştireceği için çok iyi çalışıyor.

Sözlüğü, işlenmek üzere Jinja2'ye aktarmadan önce filtrelemem gerekir mi?

    
48
  1. Şablona müdahale etmeden yapmanın bir yolu var mı?
    2015-04-14 15: 41: 42Z
5 Yanıtlar                              5                         

Jinja2'nin yeni sürümlerinde (2.9+):

{{ value if value }}

Jinja2’nin eski sürümlerinde (2.9’dan önce):

{{ value if value is not none }} harika çalışıyor.

bu, başka birinin kullanmayı denememesiyle ilgili bir hataya yol açarsa ..

{{ value if value is not none else '' }}

    
44
2018-11-15 08: 34: 13Z
  1. @GeenHenk'in yaşadığı sorunu önlemek için {{ value if value != None else '' }} gerekli olabilir
    2015-04-14 20: 12: 05Z
  2. is not None yerine != None kullanılması gerektiğini düşünüyorum.
    2015-08-05 06: 04: 14Z
  3. Bugün bu bana TemplateAssertionError: no test named 'None' veriyor
    2016-03-20 18: 35: 00Z
  4. none'u kullanmalı. Referans: github.com/pallets/jinja/issues/520
    2016-08-29 02: 38: 39Z
  5. 2017 itibariyle (Jinja 2.9), {{ value if value }}'a ihtiyacınız var. Hiçbiri ile karşılaştırmaya gerek yok.
    2017-10-23 12: 00: 44Z

Başka bir seçenek de finalize kancayı çevreye kullanmaktır:

 
>>> import jinja2
>>> e = jinja2.Environment()
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / None'

ama:

 
>>> def my_finalize(thing):
...     return thing if thing is not None else ''
...
>>> e = jinja2.Environment(finalize=my_finalize)
>>> e.from_string("{{ this }} / {{ that }}").render(this=0, that=None)
u'0 / '
    
27
2013-07-15 19: 10: 07Z

Varsayılan filtre :

 
{{ value|default("", True) }}
    
21
2014-01-09 16: 29: 36Z
  1. bu, OP'nin ana çözümü ile aynı sorunu yaşıyor ... Bunun {{value | default ("", Doğru olarak çalışacağını düşünüyorum. )}}
    2012-06-21 21: 39: 35Z
  2. Doğru olmadan, bu hiç işe yaramaz. Doğru ile, Yok ve sayısal sıfır yerine geçer. Çok iyi değil.
    2012-06-21 21: 42: 00Z
  3. Haklısınız, yalnızca değişkene kendisine atamak yerine değişken tanımlanmadığında çalışır. Ancak, Yok vakası için bir filtre yazmak, seçilen yanıttan daha az ayrıntılı olması için buna değecektir.
    2012-06-21 23: 07: 04Z
  4. Bu çözümü en çok sevdim.
    2014-08-12 01: 08: 56Z

Pocco Posta Listesindeki bu yayına göre: https://groups.google.com /d /msg /pocoo-kütüphaneleri /SQ9ubo_Kamw /TadIdab9eN8J

Armin Ronacher (Jinja2 /Flask, vb. yaratıcısı) aşağıdaki "pythonic" snippet'ini önerir:

{{ variable or 0 }} {{ variable or '' }}

Buradaki kavram, bir kez daha, açık olmanın örtük olması tercih edilir.

Düzenle: Seçilen cevap kesinlikle doğru cevap. Gerçekten bir şablon değişkeninin bir dize veya sayısal sıfır olacağı bir durumla karşılaşmadım, bu yüzden yukarıdaki pasajlar şablondaki kod gürültüsünü azaltmaya yardımcı olabilir.

    
18
2014-10-24 03: 09: 02Z
  1. Sorunun cevabı, sayısal sıfırı da bastırdığı için, bunun işe yaramadığını belirtti.
    2014-10-23 21: 34: 02Z

Özel bir filtre sorunu çözebilir. Bunu şöyle ilan et:

 
def filter_supress_none(val):
    if not val is None:
        return val
    else:
        return ''

Bu şekilde kurun:

 
templating_environment.filters['sn'] = filter_supress_none

Bu şekilde kullanın:

 
{{value|sn}}
    
14
2014-03-29 09: 39: 29Z
  1. Muhtemelen buradaki en şık çözüm. Jinja böyle bir filtreye sahip olabilir, belki de "sn" den daha az şifreli isimle :) :)
    2014-07-02 03: 27: 58Z
  2. Mükemmel cevap. Bir nitpick: if val is not None daha okunaklı olur.
    2017-03-29 23: 26: 50Z
kaynak yerleştirildi İşte