सवाल Jinja2 में स्ट्रिंग के रूप में "कोई नहीं" आउटपुट दबाएं


मैं Jinja2 को मुद्रित करने के लिए कैसे राजी करूं? "None" जब मूल्य है None?

मेरे पास एक शब्दकोश में कई प्रविष्टियां हैं और मैं अलग-अलग कीवर्ड के लिए विशेष मामलों के बजाय एक ही लूप में सबकुछ आउटपुट करना चाहता हूं। अगर मेरे पास एक मूल्य है None ( NoneType स्ट्रिंग नहीं) तो स्ट्रिंग "None" टेम्पलेट प्रतिपादन परिणामों में डाला गया है।

इसका उपयोग कर दबाने की कोशिश कर रहा है {{ value or '' }} बहुत अच्छी तरह से काम करता है क्योंकि यह संख्यात्मक मान शून्य को भी प्रतिस्थापित करेगा।

क्या मुझे इसे प्रस्तुत करने के लिए Jinja2 में जाने से पहले शब्दकोश को फ़िल्टर करने की आवश्यकता है?


44
2018-06-21 20:57


मूल


टेम्पलेट के साथ हस्तक्षेप किए बिना इसे करने का कोई तरीका है? - lajarre


जवाब:


{{ value if value is not None }} बहुत अच्छा काम करता है।

अगर यह किसी और का उपयोग करने की कोशिश करने के बारे में कोई त्रुटि नहीं उठाता है ..

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


41
2018-06-21 21:01



{{ value if value != None else '' }} @ ग्रीनहेन की समस्या से बचने के लिए आवश्यक हो सकता है - robo
मुझे लगता है is not None के बजाय != None इस्तेमाल किया जाना चाहिए। - warvariuc
आज यह सिर्फ मुझे देता है TemplateAssertionError: no test named 'None' - Kylotan
का उपयोग करते हुए none कार्य करना चाहिए। संदर्भ: github.com/pallets/jinja/issues/520 - Moaaz
2017 तक (जिनजा 2.9), आपको बस इसकी आवश्यकता है {{ value if value }}। किसी से तुलना करने की कोई ज़रूरत नहीं है। - cjlallana


एक और विकल्प का उपयोग करना है finalize पर्यावरण पर हुक:

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

परंतु:

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





डिफ़ॉल्ट फ़िल्टर:

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

21
2018-06-21 21:35



ओपी के मुख्य समाधान के रूप में यह वही समस्या है ... मुझे लगता है कि यह {{value | default ("" के रूप में काम करेगा, सच )}} - Joran Beasley
सच के बिना, यह बिल्कुल काम नहीं करता है। सच के साथ, यह किसी और संख्यात्मक शून्य को प्रतिस्थापित करता है .. तो कोई अच्छा नहीं। - Spaceghost
आप सही हैं, यह केवल तब काम करता है जब चर को परिभाषित करने के बजाय चर निर्दिष्ट नहीं किया जाता है। लेकिन किसी भी मामले के लिए फ़िल्टर लिखना सिर्फ चयनित उत्तर से कम वर्बोज़ होने के लायक नहीं होगा। - solarc
मुझे यह समाधान सबसे अच्छा लगता है। - corvid


पोको मेलिंग सूची से इस पोस्ट के अनुसार: https://groups.google.com/d/msg/pocoo-libs/SQ9ubo_Kamw/TadIdab9eN8J

अरमीन रोनाकर (जिनजा 2 / फ्लास्क, आदि के निर्माता ...) निम्नलिखित "पायथनिक" स्निपेट की सिफारिश करते हैं:

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

यहां एक बार फिर यह धारणा स्पष्ट है कि स्पष्ट रूप से स्पष्ट है।

संपादित करें: चयनित उत्तर निश्चित रूप से सही है। मैं वास्तव में ऐसी परिस्थिति में नहीं आया हूं जहां एक टेम्पलेट वैरिएबल या तो स्ट्रिंग या न्यूमेरिक शून्य होगा, इसलिए उपरोक्त स्निपेट टेम्पलेट में कोड शोर को कम करने में मदद कर सकता है।


18
2017-10-23 20:35



इस सवाल में यह उल्लेख किया गया था कि इससे मदद नहीं मिलती क्योंकि यह संख्यात्मक शून्य भी दबाती है - Spaceghost


एक कस्टम फ़िल्टर समस्या को हल कर सकते हैं। इसे इस तरह घोषित करें:

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

इसे इस तरह स्थापित करें:

templating_environment.filters['sn'] = filter_supress_none

इसे इस तरह प्रयोग करें:

{{value|sn}}

14
2018-03-29 09:39



शायद यहां सबसे सुंदर समाधान। जिनजा के पास इस तरह का फ़िल्टर हो सकता है, शायद "स्न" से कम क्रिप्टिक नाम के साथ :) - Peter Lada
बहुत बढ़िया जवाब। एक नाइटपिक: if val is not None अधिक पठनीय होगा। - MarredCheese