2010-02-07 3 views
7

मैं Django टेम्पलेट में मॉडल मानों के शब्दकोश के एक शब्दकोश पर फिर से प्रयास करने की कोशिश कर रहा हूं - मैं इसके मूल्य के साथ प्रत्येक मॉडल फ़ील्ड के verbose_name को सूचीबद्ध करना चाहता हूं।यहाँ क्या गलत है? Django टेम्पलेट में एक शब्दकोश में Iterating

class Manors(models.Model): 
    structidx = models.IntegerField(primary_key=True, verbose_name="ID")  
    county = models.CharField(max_length=5, null=True, blank=True, verbose_name="County") 

    def get_fields(self): 
      d = {} 
      #d["database"] = "pubs" 
      #d["uid"] = "sa" 
      for field in Manors._meta.fields: 
       d[field.verbose_name(self)] = field.value_to_string(self) 
      return d 

और views.py में:

manor_stats = Manors.objects.get(structidx__exact=id) 
    return render_to_response('template.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request)) 

और टेम्पलेट में:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.get_fields %} 
<li> {{ key }}: {{ value }} </li> 
{% endfor %} 
</ul> 

लेकिन मैं सिर्फ एक मिल

यहाँ मैं models.py में है अजीब, विकृत दिखने वाली सूची जैसे:

u: i 
d: a 

यदि मैं models.py में हार्ड-कोडित मानों का उपयोग करता हूं तो यह भी काम नहीं करता है (जैसा ऊपर दिखाया गया है)।

क्या गलत है? इस घंटे के लिए बाहर काम करने की कोशिश कर :(

---------- UPDATED ---------------

def get_fields(self): 
     d = {} 
     for field in Manors._meta.fields: 
      d[field.verbose_name(self)] = { "verbose": field.verbose_name(self), "value": field.value_to_string(self) } 
     return d 
साथ की कोशिश कर रहा

और टेम्पलेट में:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.get_fields %} 
<li> {{ key }}: {{ value }}</li> 
{% endfor %} 
</ul> 

सिर्फ एक खाली सूची का उत्पादन ....

उत्तर

29

पुनरावृति करने के लिए एक शब्दकोश आप की जरूरत नहीं होगी:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.get_fields.items %} 
<li> {{ key }}: {{ value }}</li> 
{% endfor %} 
</ul> 

लेकिन मैं पहले समारोह से शब्दकोश पुन: प्राप्त करने का सुझाव चाहते हैं:

Views.py:

manor_stats = Manors.objects.get(structidx__exact=id).get_fields() 
    return render_to_response('template.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request)) 

और फिर:

<h4>Statistics</h4> 
<ul> 
{% for key, value in manor_stats.items %} 
<li> {{ key }}: {{ value }}</li> 
{% endfor %} 
</ul> 

लेकिन केवल इसलिए कि मैं इस बात से परिचित नहीं हूं कि templating प्रणाली कितना dereferencing कर सकते हैं। जैसा कि आप जानते हैं कि इसे कैसे सम्मानित किया जाए, आप इसे प्रस्तुत करने के प्रयास को सहेज रहे हैं।

+0

I आपके लिए शब्द नहीं हैं सर: * – vanguard69

0

आप क्योंकि मुझे लगता है कि आप एक सेंट अधिक पुनरावृत्ति कर रहे हैं अजीब परिणाम हो रही है अंगूठी के पात्र Django टेम्पलेट्स में लूप के लिए एक पाइथन के समान नहीं है। किसी ऑब्जेक्ट का उपयोग करने और संपत्ति एक्सेसर्स for object in my objects के माध्यम से पुनरावृत्ति करने का प्रयास करें और उसके बाद object.prop1object.prop2 का उपयोग करें।

+0

क्षमा करें, मुझे थोड़ी अधिक स्पष्टीकरण की आवश्यकता है ... आप का मतलब है वस्तु को वापस करने के लिए get_fields बदलें?या get_fields से पूरी तरह से छुटकारा पाएं और किसी ऑब्जेक्ट को किसी अन्य तरीके से वापस कर दें? :( – AP257

+0

बस एक पंक्ति बदलें: डी [field.verbose_name (self)] = {"verbose": field.verbose_name (self), "value": field.value_to_string (self)} –

+0

धन्यवाद - ऊपर मेरा अद्यतन कोड देखें हालांकि, यह सिर्फ एक खाली सूची बनाता है ... – AP257

1

एक ताना पर इटरेटिंग इसकी चाबियाँ पैदा करता है। मुझे नहीं पता कि Django क्यों सोचता है कि आप अपवाद फेंकने के बजाय कुंजी नाम पर अधूरा अनुक्रम विस्तार करना चाहते हैं, लेकिन मैं इसे पर जाकर Django के टेम्पलेट इंजन के क्विर्क में से एक कर दूंगा।

वैसे भी, हां, अपने लूप में दिए गए निर्देश से key प्राप्त करें, फिर key और dict.key का उपयोग करें।

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