2009-12-18 15 views
5

The Django Book के अनुसार, Django के templating प्रणाली नेस्टेड डॉट लुकअप का समर्थन करता है:Django में नेस्टेड डॉट लुकअप टेम्पलेट्स

डॉट लुकअप नेस्ट किया जा सकता है कई स्तरों गहरी। उदाहरण के लिए, निम्न उदाहरण {{person.name.upper}} का उपयोग करता है, जो एक शब्दकोश लुकअप (व्यक्ति ['नाम']) में अनुवाद करता है, फिर एक विधि कॉल (ऊपरी()): '{{person.name.upper }} {{person.age}} साल पुराना है। '

क्या इस दृष्टिकोण के साथ goblins दस्तावेज़ीकरण में व्यापक रूप से शामिल नहीं हैं? मैं नेस्टेड डॉट लुकअप साथ समस्या हो रही हूँ - यहाँ एक न्यूनतम उदाहरण है:

views.py:

test = [{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}] 
ndx = 'bar' 
t = loader.get_template('meh.html') 
c = Context({'test': test, 
      'ndx': ndx,}) 
return HttpResponse(t.render(c)) 

meh.html टेम्पलेट:

<pre> 
    {{ test }} 
    {{ test.0 }} 
    {{ test.0.ndx }} 
</pre> 

परिणामस्वरूप HTML:

<pre> 
[{'foo': [1, 2, 3], 'bar': [4, 5, 6]}, {'baz': [7, 8, 9]}] 
{'foo': [1, 2, 3], 'bar': [4, 5, 6]} 

</pre> 

किसी सूची तत्व के भीतर एक शब्दकोश कुंजी का नेस्टेड लुकअप कुछ भी नहीं देता है, जब मैं अपेक्षा करता हूं [4, 5, 6]।

जे जे।

+0

एक Goblin के रूप में, मैं गहराई से एक पूरी दौड़ के इस तरह का लांछन से आहत हूँ ... ;-) – cethegeek

उत्तर

8

मुझे लगता है कि समस्या यह है कि आप ndx की समीक्षा कर रहे हैं जब मूल्यांकन कभी नहीं होता है। क्या आपने यह कोशिश की है:

{{ test.0.bar }} 

मुझे लगता है कि आप जो भी खोज रहे हैं वह करेंगे।

क्या इस दृष्टिकोण के साथ goblins हैं ...?

क्रमबद्ध की

, लेकिन वे लोगों को आप के बारे में बात कर रहे हैं नहीं हैं, और मुझे नहीं लगता कि यह घोंसले की वजह से है, या कम से कम, यह बदतर हो नहीं करता है के बाद आप एक स्तर गहरी मिलता है। इसका मतलब यह है कि सभी लुकअप पैरामीटर अक्षर हैं। इसे बदलने का कोई तरीका नहीं है। इसलिए जब आप कस्टम टेम्पलेट टैग विकसित करने और मूल्यांकन के लिए उन्हें अक्षर या चर पारित करने में सक्षम हो सकते हैं, तो आप वास्तव में भाग्य से बाहर हैं यदि आप किसी अन्य मूल्य के मूल्यांकन मूल्य के आधार पर किसी चर के किसी सदस्य को सीधे एक्सेस करना चाहते हैं। (आप इसके लिए एक टेम्पलेट टैग लिख सकते हैं, लेकिन यह सभी वांछित परिस्थितियों में काम नहीं करेगा और संभवतः इसके लायक से अधिक जटिल है।)

जो कुछ भी लायक है, यह टेम्पलेटिंग का एक सुंदर जानबूझकर पहलू जैसा दिखता है भाषा। मैं आपको यह विचार करने के लिए आमंत्रित करता हूं कि कैसे एक्सेसर को पता होना चाहिए कि {{ foo.bar }} को foo[bar] या foo['bar'] के रूप में पढ़ा जाना चाहिए। सिंटैक्स को जटिल किए बिना सार्थक निर्णय लेने के लिए ऐसा प्रतीत नहीं होता है और यह ऐसा कुछ है जो django का टेम्पलेट डिज़ाइन से बचने के लिए अशिष्ट है।

+2

प्रश्न पूछने के लिए धन्यवाद * मुझे पूछना चाहिए था। :-) –

1

डेविड सही है: ndx का मूल्यांकन करने के लिए मूल्यांकन नहीं किया जाएगा, इसका उपयोग शाब्दिक रूप से एक कुंजी के रूप में किया जाएगा। आप जो चाहते हैं उसे करने के लिए आप एक नया टेम्पलेट टैग परिभाषित कर सकते हैं, यहां एक सरल है: http://www.djangosnippets.org/snippets/1412/

4

डेविड के उत्तर पर विस्तार करने के लिए, Django का टेम्प्लेट सिस्टम आपको संदर्भ चर के मान को कुंजी के रूप में उपयोग करने की अनुमति नहीं देता है।तो, अपने उदाहरण में

{{ test.0.ndx }} 

वास्तव में कुंजी "ndx" के लिए test संदर्भ चर में पहला आइटम में लग रही है।

यदि आपको इस कार्यक्षमता की आवश्यकता है, तो आपको टेम्पलेट फ़िल्टर के रूप में इसे स्वयं लागू करने की आवश्यकता है। This ticket में इस सुविधा के चूक के पीछे Django devs तर्क और आपके द्वारा देखे जा रहे टेम्पलेट फ़िल्टर का एक उदाहरण कार्यान्वयन समेत अधिक जानकारी है।

1

मेरा सुझाव था या तो (और मैं आपकी समस्या के डेविड की व्याख्या से सहमत):

{{ test.0.bar }} # as david mentioned, or 

ndx=test[0]['bar'] # in views 
{{ ndx }} # in template 
संबंधित मुद्दे