Answers:
为了回应/扩展Jeff的评论,我认为您应该针对的只是Choice类中的一个属性,该属性计算与该对象关联的投票数:
class Choice(models.Model):
text = models.CharField(max_length=200)
def calculateVotes(self):
return Vote.objects.filter(choice = self).count()
votes = property(calculateVotes)
然后在模板中,您可以执行以下操作:
{% for choice in choices %}
{{choice.choice}} - {{choice.votes}} <br />
{% endfor %}
模板标签,恕我直言,此解决方案有些过分,但也不是一个糟糕的解决方案。Django中模板的目标是使您与模板中的代码隔离,反之亦然。
我会尝试上述方法,并查看ORM生成的SQL,因为我不确定它是否会预先缓存属性并仅为该属性创建子选择,还是会迭代/启用-需求运行查询以计算投票数。但是,如果它产生了残酷的查询,您总是可以使用自己收集的数据填充视图中的属性。
.items
调用结合在一起(如其他答案之一所示)是一种简单得多的解决方案。
choices = {'key1':'val1', 'key2':'val2'}
这是模板:
<ul>
{% for key, value in choices.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
</ul>
基本上,.items
是Django关键字,它将字典分为(key, value)
成对的列表,很像Python方法.items()
。这样可以在Django模板中的字典上进行迭代。
items
一下,是对字典的Python方法调用,而不是Django关键字。正如Alex Martelli所指出的,它与基本上相同iteritems
。正如Wilhelm回答的那样,字典查找在点查找方面排在第三位。如果您的字典中有一个名为的项目'items'
,那么您将获得该值,而不是元组列表。测试:将其添加{'items':'oops'}
到字典中,您会从单词'oops'中获得字母的项目符号列表
您可以使用点符号:
点查找可以总结如下:当模板系统遇到变量名称中的点时,它将按以下顺序尝试以下查找:
- 字典查询(例如foo [“ bar”])
- 属性查询(例如foo.bar)
- 方法调用(例如foo.bar())
- 列表索引查找(例如,foo [2])
系统使用有效的第一种查找类型。这是短路逻辑。
my_dict[1][2]
模板代码:my_dict.1.2
d.key.1
-请注意第二个版本.
使用字典项目:
{% for key, value in my_dictionay.items %}
<li>{{ key }} : {{ value }}</li>
{% endfor %}
django_template_filter 过滤器名称get_value_from_dict
{{ your_dict|get_value_from_dict:your_key }}