2012-08-17 28 views
5

Django में करने के लिए MAKO, हम ऐसा कर सकते हैं:तोरणों कैसे करता है, तो चर मौजूद जाँच करें या नहीं

views.py : 

    def A(request): 
     context = {test : 'test'} 
     return render_to_response('index.html', context , context_instance = RequestContext(request)) 

    def B(request): 
     context = {} 
     return render_to_response('index.html', context , context_instance = RequestContext(request)) 

index.html: 

     {% if test %} 
      {{ test }} 
     {% endif %} 

और हमारे टेम्पलेट त्रुटि के बिना प्रस्तुत करना है, भले ही मैं method B, जहां चर 'test' मौजूद नहीं है का उपयोग करें, लेकिन मैं अभी भी इसे टेम्पलेट में डाल सकता हूं।

मैं नियंत्रक में, तोरणों के साथ एक ही + mako क्या करना चाहते हैं:

foo.py 

    def A(self): 
     c.test = 'test' 
     return render('index.html') 

    def B(self): 
     return render('index.html') 

index.html : 

     % if c.test: 
      ${'c.test'} 
     % endif 

Django में, मैं ऐसा कर सकते हैं, लेकिन Pylons में, मैं कोई त्रुटि मिलती है, वहाँ वैसे भी जांच करने के लिए wheter 'c.test' मौजूद है या नहीं?

त्रुटि: AttributeError:

% if someval is UNDEFINED: 
    someval is: no value 
% else: 
    someval is: ${someval} 
% endif 

डॉक्स वर्तमान संदर्भ में नहीं चर नाम संदर्भित के रूप में इस का वर्णन: 'ContextObj' ऑब्जेक्ट कोई विशेषता 'परीक्षण'

उत्तर

4

mako Docs on Context Variables से है। माको इन चर को UNDEFINED मान पर सेट करेगा।

मैं बहुत की तरह चर के लिए जाँच:

% if not someval is UNDEFINED: 
    (safe to use someval) 

हालांकि, अगर तोरणों/पिरामिड strict_undefined=True सेटिंग है, एक NameError में अपरिभाषित अलग-अलग परिणाम उपयोग करने के लिए उठाया जा रहा प्रयास करता है। वे इस तरह से ऐसा करने के लिए एक संक्षिप्त philisophical औचित्य देते हैं, बस पाइथन दर्शन के साथ संगत लगता है कि खाली तारों के साथ un-set चरों को बदलने की बजाय। इसे खोजने के लिए मुझे थोड़ी देर लग गई, लेकिन पूरे section on the Mako Runtime को पढ़कर यह स्पष्ट हो जाएगा कि माको कैसे संदर्भ चर का उपयोग करता है, सेट करता है और उपयोग करता है।

संपादित:
पूर्ण करने के लिए, दस्तावेजों strict_undefinedhere की स्थापना की व्याख्या।

[app:main] 
... 
mako.strict_undefined = false 
+0

धन्यवाद, सिर्फ एक और सवाल है, इसलिए यदि मुझे यकीन नहीं है कि कुछ चर मौजूद हैं या नहीं, तो सख्त_ंडिफाइन = सही का उपयोग न करें? – Santana

+0

नहीं, मुझे लगता है कि एक कोशिश में लपेटना/ब्लॉक को छोड़कर अभी भी उस मामले में काम करेगा। मैं किसी और को अनुभवी व्यक्ति के लिए स्थगित कर दूंगा, लेकिन संदेह है कि यह एक सतत कोडिंग शैली को रखने के बारे में अधिक है। मुझे यकीन नहीं है कि यह एक दूसरे के ऊपर एक और तरीका है 'अधिक सही' है। – chris

+1

मैंने एक ऐसा उत्तर जोड़ा जो सख्त_ंडिफाइन पर निर्भर नहीं है –

0

थोड़ी देर हो चुकी है, इसलिए जब भी आप अपने टेम्पलेट पर एक चर है कि आपके नियंत्रक पर मौजूद नहीं है का उपयोग करें, तोरणों एक त्रुटि बढ़ा देंगे: आप अपने .ini फ़ाइलों में से एक में यह निर्धारित करके इस चर को बदल सकते हैं , त्रुटि को निष्क्रिय करने के लिए, बस अपने environment.py में रखते:

config['pylons.strict_tmpl_context'] = False 
6

मैं ने वही समस्या है जहाँ मैं एक ही टेम्पलेट का उपयोग कर और परीक्षण करने के लिए अगर एक चर स्थापित किया गया था की जरूरत है ऐसे कई दृश्य था। मैंने डॉक्स क्रिस को संदर्भित किया और इस समस्या को हल करने का एक और तरीका पाया, चाहे mako.strict_undefined सेट किया गया हो। अनिवार्य रूप से आप get() विधि को context ऑब्जेक्ट पर कॉल करें। अपने उदाहरण में आप निम्नलिखित कर सकता है:

% if context.get('test', UNDEFINED) is not UNDEFINED: 
    ${test} 
% endif 

या

${context.get('test', '')} 

कि ${test} रूप में एक ही प्रिंट होगा अगर यह मौजूद है, और एक खाली स्ट्रिंग मुद्रित करता है, तो ऐसा नहीं है।

दुर्भाग्य से आप ऑपरेटर का उपयोग context पर नहीं कर सकते हैं जो सबसे सहज ज्ञान युक्त होगा।