Jinja2

2012-06-21 13 views
41

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

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

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

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

+1

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

उत्तर

37

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

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

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

+1

मुझे इसके साथ एक त्रुटि मिली: 'अपरिभाषित त्रुटि: इनलाइन अगर अभिव्यक्ति गलत पर मूल्यांकन की गई है और कोई और खंड परिभाषित नहीं किया गया है।' –

+4

'{{मूल्य अगर मूल्य! = कोई और नहीं '}}} समस्या से बचने के लिए आवश्यक हो सकता है @GeenHenk – robo

+2

मुझे लगता है कि '! = None' के बजाय 'कोई नहीं है' का उपयोग किया जाना चाहिए। – warvariuc

20

Default filter:

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

यह ओपी के मुख्य समाधान के समान समस्या है ... मुझे लगता है कि यह {{value | default ("", ** True **)}} –

+0

के रूप में काम करेगा, यह सच नहीं है, यह बिल्कुल काम नहीं करता है। सच के साथ, यह किसी और संख्यात्मक शून्य को प्रतिस्थापित करता है .. तो कोई अच्छा नहीं। – Spaceghost

+0

आप सही हैं, यह केवल तब काम करता है जब चर को परिभाषित करने के बजाय चर निर्दिष्ट नहीं किया जाता है। लेकिन किसी भी मामले के लिए फ़िल्टर लिखना सिर्फ चयनित उत्तर से कम वर्बोज़ होने के लायक नहीं होगा। – solarc

24

एक अन्य विकल्प पर्यावरण पर 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/' 
14

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

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

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

{{value|sn}} 
+2

शायद यहां सबसे सुंदर समाधान है। जिनजा के पास इस तरह का फ़िल्टर हो सकता है, शायद "स्न" से कम क्रिप्टिक नाम के साथ :) –

+2

शानदार उत्तर। एक नाइटपिक: 'यदि वैल कोई नहीं है' और अधिक पठनीय होगा। – MarredCheese

17

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

templating_environment.filters['sn'] = filter_supress_none 

इस तरह इसका इस्तेमाल

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

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

धारणा है कि यहाँ किया जा रहा है एक बार फिर से, स्पष्ट निहित करने के लिए बेहतर है।

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

+0

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