2010-02-07 62 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里面。