2011-01-21 19 views
59
import collections 

data = [ 
    {'firstname': 'John', 'lastname': 'Smith'}, 
    {'firstname': 'Samantha', 'lastname': 'Smith'}, 
    {'firstname': 'shawn', 'lastname': 'Spencer'}, 
] 

new_data = collections.defaultdict(list) 

for d in data: 
    new_data[d['lastname']].append(d['firstname']) 

print new_data 

यहाँ उत्पादन है:Django टेम्पलेट नहीं कर सकते पाश defaultdict

defaultdict(<type 'list'>, {'Smith': ['John', 'Samantha'], 'Spencer': ['shawn']}) 

और यहाँ टेम्पलेट है:

{% for lastname, firstname in data.items %} 
    <h1> {{ lastname }} </h1> 
    <p> {{ firstname|join:", " }} </p> 
{% endfor %} 

लेकिन मेरे टेम्पलेट में पाश काम नहीं करता। कुछ भी नहीं दिखाता है। यह मुझे एक त्रुटि भी नहीं देता है। मैं इसे कैसे ठीक करूं?

<h1> Smith </h1> 
<p> John, Samantha </p> 

<h1> Spencer </h1> 
<p> shawn </p> 
+0

आपने कोड नहीं दिखाया है जो शब्दकोश को टेम्पलेट के संदर्भ में रखता है। क्या आप वाकई ठीक से हो रहे हैं? –

+0

हां, बाकी सब कुछ लूप के बाहर सही ढंग से प्रस्तुत करता है। – user216171

उत्तर

36

कोशिश:: यह firstname के साथ lastname, कुछ इस तरह दिखाने के लिए चाहिए था

dict(new_data) 

और अजगर 2 में यह बेहतर है बजाय iteritems उपयोग करने के लिए items :)

+2

मैं उस काम की तरह कुछ सरल नहीं मान सकता। आपका बहुत बहुत धन्यवाद! – user216171

+6

यह वास्तव में django के खिलाफ एक बग के रूप में दायर किया गया था: https://code.djangoproject.com/ticket/16335 लेकिन एकमात्र अच्छा समाधान वास्तव में इसे एक ताना में बदलना था, क्योंकि अब यह [डॉक्स] में दिखाया गया है (https://docs.djangoproject.com/en/dev/topics/templates/#variables) और यह [changeet] में दिखाई देता है (https://code.djangoproject.com/ticket/16335) – Stefano

70

एक बार जब आप नए मान डालते हैं तो डिफ़ॉल्ट डिक्ट की डिफॉल्ट फीचर को अक्षम करके आप प्रतिलिपि को नए नियम में सहेज सकते हैं:

new_data.default_factory = None 

स्पष्टीकरण

template variable resolution algorithm in Django जब defaultdict (सूची) का उपयोग कर new_data.itemsnew_data['items'], पहले के रूप में जो एक खाली सूची पर ले कर हल करने का प्रयास करेंगे।

एक खाली सूची के लिए दोषी को निष्क्रिय और Django new_data['items'] पर असफल करवाने के लिए तो new_data.items() बुला जब तक संकल्प प्रयास जारी है, default_factory attribute of defaultdictकोई नहीं करने के लिए सेट किया जा सकता है।

+6

+1 - यह है चयनित उत्तर से अधिक कुशल, खासकर एक बड़े शब्दकोश सेट के साथ। – keithhackbarth

+0

महान उत्तर, स्पष्टीकरण ने अंडरलेइंग समस्या को समझने में बहुत मदद की! – Blackeagle52

+0

मैं जोड़ सकता हूं कि एक {% के ​​लिए v, v detauldictvar%} में आपको डिफॉल्ट डिक्टोरियल तत्व पर फिर से सेट करने की इजाजत देता है, यहां तक ​​कि डिफ़ॉल्ट_फैक्टरी को बिना किसी सेट के सेट किए। सेबस्टियन स्पष्टीकरण अब मैं समझ सकता हूं क्यों :-) – RobM

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