2010-02-07 55 views
7

我想遍歷Django模板中的模型值的字典 - 我想列出每個模型字段的verbose_name以及它的值。這裏有什麼問題?在Django模板中迭代字典

下面是我在models.py:

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> 

但我只是得到一個奇怪,扭曲看起來像列表:

u: i 
d: a 

如果我在models.py中使用硬編碼值(如上所示註釋),它甚至不會工作。

這裏有什麼問題?一直在努力工作,這一點數小時:(

----------修訂---------------

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> 

但僅僅是因爲我不熟悉模板系統可以做多少解引用。看到您知道如何尊重它,您可以節省渲染器的工作量。

+0

I先生,沒有你的話。:* – vanguard69 2015-07-08 21:31:14

0

你得到奇怪的結果,因爲我認爲你迭代一個ST戒指的人物。 django模板中的for循環與python中的循環不同。嘗試使用對象並通過屬性訪問器for object in my objects進行迭代,然後使用object.prop1object.prop2代替。

+0

對不起,我需要更多的解釋...你的意思是改變get_fields返回一個對象?或者完全擺脫get_fields並以其他方式返回對象? :( – AP257 2010-02-07 21:35:43

+0

只需更改一行:d [field.verbose_name(self)] = {「verbose」:field.verbose_name(self),「value」:field.value_to_string(self)} – 2010-02-07 21:38:26

+0

謝謝 - 請參閱上面的更新代碼然而,這只是產生一個空白列表... – AP257 2010-02-07 21:47:49

1

對字典進行迭代會產生密鑰。我不知道爲什麼Django認爲你想在關鍵名稱上做一個不完整的序列擴展,而不是拋出異常,但是我會把它填充到另一個 Django模板引擎的怪癖之一。

無論如何,是的,得到key從您的for循環字典,然後使用keydict.key裏面。