Jinja2 टेम्पलेट चर अगर कोई भी वस्तु एक डिफ़ॉल्ट मूल्य निर्धारित करता है


146

कैसे jijna2 में डिफ़ॉल्ट रूप से एक चर बनाने के लिए "" यदि वस्तु इस तरह से कुछ करने के बजाय कोई नहीं है?

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

इसलिए यदि ऑब्जेक्ट p कोई नहीं है तो मैं p (first_name और last_name) के मानों को "" डिफॉल्ट करना चाहता हूं। मूल रूप से

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

त्रुटि प्राप्त करना:

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

1
उस फ़ंक्शन को बनाएं जो pकभी वापस नहीं लौटा NoneNoneफ़ंक्शन के बजाय एक प्रॉक्सी ऑब्जेक्ट को वापस करना चाहिए जिसमें वास्तविक ऑब्जेक्ट के समान संरचना है लेकिन यह डिफ़ॉल्ट मानों के साथ लोड किया गया है जो आप चाहते हैं।
मिगेल

मैं इसका उपयोग करता हूं, और मेरी समस्या हल हो गई थी: {% if p! = None%} {{p.User ['first_name']]}} {% endif%}
मोना मोहम्मदीनिया

जवाबों:


242

noneअंतर्निहित फ़ंक्शन का उपयोग करें ( http://jinja.pocoo.org/docs/templates/#none ):

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

या

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

या यदि आपको एक खाली स्ट्रिंग की आवश्यकता है:

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

19
noneजवाब में लोअरकेस को नोटिस करें । मेरी समस्या हल हो गई जब मैंने किसी के मामले को सही नहीं किया।
हार्पर्विल


70

डॉक्स के अनुसार आप बस कर सकते हैं:

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

कारण Noneके लिए डाले Falseबूलियन संदर्भ में।


अद्यतन : जैसा कि उल्लिखित है, यह केवल साधारण डेटा प्रकारों के लिए काम करता है।


5
यह एक साधारण चर के लिए काम करता है, लेकिन इस सवाल के लिए नहीं कि आप एक क्षेत्र को और अधिक जटिल से कैसे पकड़ना चाहते हैं। मैं इसे नीचा दिखाऊंगा, क्योंकि यह मूल प्रश्न का एक अच्छा जवाब नहीं है ... और फिर भी एक ही समय में, इसके बारे defaultमें जानना ठीक है कि मुझे अपने विशेष मामले के लिए क्या चाहिए, इसलिए ... बस मतदान नहीं। (इस उत्तर के लिए एक अच्छी तरह से संपादित करें यह एक वोट दें कमा सकता है सिवाय मुझे लगता है कि इसे लागू करने की संभावना मुश्किल है defaultइस स्थिति के लिए)
lindes

31

अन्य उत्तरों के अलावा, कोई और कुछ लिख सकता है यदि चर कोई भी ऐसा नहीं है:

{{ variable or '' }}

3
मैं इस सरलता से चकित हूँ! अजगर का x or yहै if x is false, then y, else x। देखें: 5.2। बूलियन ऑपरेशन - और, या नहीं
kenjiuno

10

इस दस्तावेज़ के बाद आप इस तरह से कर सकते हैं:

{{ p.User['first_name']|default('NONE') }}

8
मुझे ऐसा नहीं लगता - यदि मान अपरिभाषित / गायब है तो "डिफ़ॉल्ट" टेम्पलेट फ़िल्टर डिफ़ॉल्ट मान लौटाता है।
कोडपे

Ansible का उपयोग करते समय मेरे लिए काम किया। इसने इसे और अधिक स्पष्ट कर दिया: stackoverflow.com/q/28885184/1005215
नेहल जे वानी

1
यदि p को परिभाषित किया गया है। लेकिन अगर P को परिभाषित नहीं किया जाता है तो यह काम नहीं करता है
d

5

"P" या "p.User" के अपवाद को फेंकने से बचने के लिए कोई नहीं है, आप इसका उपयोग कर सकते हैं:

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

4
यह केवल एक है जिसने मेरे लिए काम किया, मेरे चर को एक तानाशाही में गहरे दफन किया गया था।
क्रेसीरजैक

यह बहुत से तर्क के साथ कुछ अन्य लोगों को साफ करने में मदद करता है।
ईगलिंग 33322

1

एक अन्य समाधान के रूप में (कुछ पिछले वाले की तरह):

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

अंतिम चर पर ध्यान दें (p.User ['first_name']) if definedइसके बाद परीक्षण नहीं है ।


0

मैं आमतौर पर एक परिभाषित nvlसमारोह, और में रख globalsऔर 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

एक टेम्पलेट में उपयोग:

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

// or 

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.