Soru Jinja2'de “None” çıktısını dizge olarak bastır


Jinja2'yi basmamaya nasıl ikna ederim? "None" değer ne zaman None?

Bir sözlükte çok sayıda giriş var ve farklı anahtar kelimeler için özel durumlar yerine her şeyi tek bir döngüde çıkarmak istiyorum. Eğer bir değerim varsa None ( NoneType dize değil) "None" şablon oluşturma sonuçlarına eklenir.

Kullanarak bastırmaya çalışıyorum {{ value or '' }} sayısal değer sıfırın yerini alacak kadar iyi çalışır.

Sözlükü, işleme için Jinja2'ye aktarmadan önce filtrelemem gerekir mi?


44
2018-06-21 20:57


Menşei


Şablona müdahale etmeden bunu yapmanın bir yolu var mı? - lajarre


Cevaplar:


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

eğer başka bir şey kullanmama konusunda bir hata ortaya çıkarsa, başka birini kullanmayı deneyin.

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


41
2018-06-21 21:01



{{ value if value != None else '' }} @GeenHenk problemi önlemek için gerekli olabilir - robo
bence is not None yerine != None kullanılmalıdır. - warvariuc
Bugün bu bana sadece TemplateAssertionError: no test named 'None' - Kylotan
kullanma none çalışmalı. Referans: github.com/pallets/jinja/issues/520 - Moaaz
2017'den itibaren (Jinja 2.9), sadece ihtiyacınız var {{ value if value }}. Hiçbiri ile karşılaştırmaya gerek yok. - cjlallana


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

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

fakat:

>>> 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 / '

25
2017-07-15 19:10





Varsayılan filtre:

{{ value|default("", True) }}

21
2018-06-21 21:35



Bu OP'nin ana çözümü ile aynı soruna sahip ... Bence bu {{value | default ("), Doğru )}} - Joran Beasley
Doğru olmadan, bu hiç işe yaramıyor. Doğru ile, Yok ve sayısal sıfır yerini alır .. bu yüzden iyi değil. - Spaceghost
Haklısınız, sadece değişkenin Yok'a atanması yerine tanımlanmadığı zaman çalışır. Ancak, Hiçbiri vakasına bir filtre yazmak, sadece seçilen cevaptan daha az verim olduğu için buna değecektir. - solarc
Bu çözümü en çok beğendim. - corvid


Bu gönderiye göre Pocco Mail Listesinden: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

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

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

Buradaki düşünce, bir kez daha açık, dolaylı olarak tercih edilir.

Düzenleme: Seçilen cevap kesinlikle doğru olanıdır. Şablon değişkeninin bir dize veya sayısal sıfır olacağı bir duruma gerçekten rastlamadım. Bu nedenle, yukarıdaki snippet'ler şablondaki kod gürültüsünü azaltmaya yardımcı olabilir.


18
2017-10-23 20:35



Sorunun, sayısal sıfırlamayı da bastırdığı için bunun yardımcı olmadığına dikkat çekildi. - Spaceghost


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

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

Bunu şöyle yükleyin:

templating_environment.filters['sn'] = filter_supress_none

Bunu şöyle kullanın:

{{value|sn}}

14
2018-03-29 09:39



Muhtemelen buradaki en zarif çözüm. Jinja böyle bir filtreye sahip olabilir, belki de "sn" den daha az şifreli isimle :) - Peter Lada
Mükemmel cevap. Bir nitpick: if val is not None Daha okunabilir olurdu. - MarredCheese