这里有什么问题?在Django模板中遍历字典

7 投票
3 回答
19186 浏览
提问于 2025-04-15 19:00

我正在尝试在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>

结果只是一个空列表……

3 个回答

0

你得到奇怪结果的原因是我觉得你在遍历一个字符串的字符。在Django模板中,for循环和Python中的用法不一样。你可以试着用一个对象,然后通过属性访问来遍历,比如用 for object in my objects,接着使用 object.prop1object.prop2 来获取你需要的内容。

1

遍历一个字典时,会得到它的键。我不太明白为什么Django会认为你想要对键名进行不完整的序列扩展,而不是抛出一个异常,但我想这又是Django模板引擎的一个奇怪之处。

总之,是的,在你的循环中从字典中获取 key,然后在循环内部使用 keydict.key

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>

这只是因为我对模板系统能做多少解引用不是很熟悉。既然你知道怎么解引用,那你就省去了让渲染器去处理这些的麻烦。

撰写回答