2012-01-20 16 views
18

में गतिशील रूप से सूची आइटम प्राप्त करें मेरे पास पृष्ठ पर कुछ लूप है और लूप संख्या के आधार पर सूची आइटम की आवश्यकता है।django टेम्पलेट्स

जब मैं फोन:

{{ mylist.1 }} 
{{ mylist.2 }} 
{{ mylist.3 }} 

सब ठीक काम करता है, लेकिन क्या मैं वास्तव में जरूरत है कुछ इस तरह है:

{% for x in somenumber|MyCustomRangeTag %} 
    {{ mylist.x }} 
{% endfor %} 

MyCustomRangeTag मुझे अजगर range() देता है यह काम करता है और मैं पहले से ही x संख्या के रूप में की है। तो x लूप संख्या के आधार पर 1, 2, 3 आदि है। क्या यह संभव है और कैसे?

+0

क्या आप केवल उन मूल्यों को पारित कर सकते हैं जिन्हें आपको दृश्य में चाहिए? यदि आप हाथ से पहले सीमा को जानते हैं तो क्यों न केवल सटीक मूल्यों को पारित करें जिन्हें आप प्रदर्शित करने का प्रयास कर रहे हैं? – dm03514

+0

नहीं, मैं इस मामले में नहीं कर सकता। यह हार्ड कोडिंग कस्टम शॉपिंग कार्ट पेज है और यह सब कुछ नेस्टेड रूपों का हिस्सा है। – Goran

उत्तर

25

यह संभव नहीं है सीधे क्योंकि Django सोचता "x"mylist में देखने के लिए महत्वपूर्ण है कि है - के बजाय एक्स का मान। तो, जब x = 5, Django mylist[5] के बजाय mylist["x"] को देखने का प्रयास करता है।

समाधान के रूप में निम्नलिखित फ़िल्टर का उपयोग करें:

@register.filter 
def lookup(d, key): 
    return d[key] 

और तरह

{{ mylist|lookup:x }} 
+2

क्या होगा यदि '{{mylist | lookup: x}} 'का आउटपुट एक ऑब्जेक्ट है और मुझे कुछ और एक्सेस करने की आवश्यकता है? कुछ 'mylist.1.first_name' – zengr

+2

@zengr' {_% lookup_result = mylist | lookup: x%} {{lookup_result.first_name}} {% endwith%} 'की कोशिश करें। – valid

3

क्या आप वाकई बस नहीं कर सकते:

{% for item in mylist %} 
    {{ item }} 
{% endfor %} 
टुकड़ा फिल्टर के साथ

, तुम भी कुछ अनुकूलन कर सकते हैं।

+0

मुझे लगता है कि आप दूसरी पंक्ति पर '{{item}}' होने का मतलब है। यह ध्यान देने योग्य भी है कि यदि आप किसी कारण से किसी इंडेक्स की आवश्यकता है तो आप लूप के भीतर '{{forloop.counter}} 'का उपयोग कर सकते हैं। – aganders3

+0

हाहा, कोई चिंता नहीं। हालांकि टिप के लिए धन्यवाद। मैं वास्तव में आपके प्रतिनिधि द्वारा डर नहीं था, मैं बस भूल गया कि हम जवाब संपादित करने में सक्षम हैं। हालांकि, जब मैं भविष्य में शर्मीला महसूस करता हूं तो यह मुझे प्रेरित करेगा। – aganders3

6

इसका इस्तेमाल मैं उस @ ई-काफ़ी यह उल्लेख किया नोटिस, लेकिन मैं निर्मित टुकड़ा टेम्पलेट टैग हकदार लगता है कुछ मोहब्बत।

{{ item | slice:"2" }} #gets the third element of the list 
+0

यह पहले काम कर सकता है लेकिन कुछ मज़ाकिया परिणाम दिए जब मैंने इसे django 1.5 – Alvin

+0

के साथ एक शॉट दिया, यह मेरे लिए काम नहीं करता है, लेकिन '{{some_list | टुकड़ा:": 2 "}}' चाल --https : //docs.djangoproject.com/en/1.7/ref/templates/builtins/#slice – Hayden

+0

@ हैडन मुझे विश्वास है कि सूची के पहले दो तत्व ही प्राप्त होते हैं? मैंने फ़िल्टर सिंटैक्स को ठीक करने के लिए कोड अपडेट किया। –

4

Django टेम्पलेट्स में टुकड़ा टैग अजगर का टुकड़ा करने की क्रिया कोड का उपयोग सकता है, लेकिन वाक्य रचना निश्चय अलग है।

>>>mylist = ["0th Element", "1th Element"] 
>>>zero, one = 0, 1 
>>>mylist[zero] 
"0th Element" 
>>>mylist[one] 
"1th Element" 

Django टुकड़ा टेम्पलेट टैग के साथ इस वाक्य रचना का उपयोग करते हुए एक कटा हुआ सूची प्रदान करेगा: उदाहरण के लिए, यदि आप अजगर, एक चर के साथ एक दृश्य का एक तत्व प्राप्त करना चाहता था आप निम्न जैसा कुछ लिखते हैं

[] ["0th Element"] ["0th Element", "1th Element"] 

नोट मतभेद: आप फिर से हो रही है

{% with "0" as zero %} 
{% with "1" as one %} 
{% with "2" as two %} 

{{mylist|slice:zero}} {{mylist|slice:one}} {{mylist|slice:two}} 

{% endwith %} 
{% endwith %} 
{% endwith %} 

एचटीएमएल को रेंडर: ज्ञात सूचकांक के एक आइटम प्राप्त करने के लिए संदिग्ध उपयोगिता के हर मामले में, mylist[x] के बजाय mylist[:x] का झुकाव।

Django इस के आसपास काम करने के लिए पर्याप्त उपकरण प्रदान करता है। पहली चाल आपके सूचकांक के लिए 0:1 जैसे स्पष्ट स्लाइस का उपयोग करना है, और उसके बाद |join:"" परिणामी सूची को एक तत्व में उपयोग करना है।इसलिए जैसा:

{% with "0:1" as zero %} 
{{mylist|slice:zero|join:""}} 
{% endwith %} 

पैदावार:

0th Element 

यह विशेष रूप से काम में आता आप जब एक बच्चे के पाश के अंदर एक iterable के साथ काम कर एक माता पिता के पाश के सूचकांक का उपयोग करने की जरूरत है:

{% for parent in parent_loop %} 
    {% cycle "0:1" "1:2" "2:3" as parent_loop_index silent %} 
    {% for child in child_loop %} 
     {{child|slice:parent_loop_index|join:""}} 
    {% endfor %} 
{% endfor %} 

स्टॉक पार्ट्स के अलावा कुछ भी नहीं मिला, हालांकि मुझे नहीं लगता कि Django ने अभी तक उपलब्धियां लागू की हैं।

+0

धन्यवाद! '| में शामिल होने:" "'! –

संबंधित मुद्दे