这有什么不对?迭代Django模板中的字典

时间:2010-02-07 21:22:30

标签: python django django-templates

我正在尝试在Django模板中迭代模型值的字典 - 我想列出每个模型字段的verbose_name及其值。

这是我在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>

只生成一个空白列表......

3 个答案:

答案 0 :(得分: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>

但这只是因为我不熟悉模板系统可以做多少解除引用。看到你知道如何尊重它,你就节省了让渲染器解决问题的努力。

答案 1 :(得分:1)

迭代dict会产生密钥。我不知道为什么Django认为你想要对键名进行不完整的序列扩展而不是抛出异常,但我会把它归结为 ANOTHER Django模板引擎的一个怪癖。 / p>

无论如何,是的,从for循环中的dict获取key,然后在其中使用keydict.key

答案 2 :(得分:0)

你得到了奇怪的结果,因为我认为你正在迭代一个字符串的字符。 django模板中的for循环与python中的不一样。尝试使用对象并通过属性访问器for object in my objects进行迭代,然后使用object.prop1 object.prop2代替。