问题:如何在Django模板中访问字典元素?
我想打印出每个选择获得的票数。我在模板中有以下代码:
{% for choice in choices %}
{{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}
votes
只是一个字典,而choices
只是一个模型对象。
该消息引发异常:
"Could not parse the remainder"
回答 0
为了回应/扩展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,因为我不确定它是否会预先缓存属性并仅为该属性创建子选择,还是会迭代/启用-需求运行查询以计算投票数。但是,如果它产生了残酷的查询,您总是可以使用自己收集的数据填充视图中的属性。
回答 1
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模板中的字典上进行迭代。
回答 2
您可以使用点符号:
点查找可以总结如下:当模板系统遇到变量名称中的点时,它将按以下顺序尝试以下查找:
- 字典查询(例如foo [“ bar”])
- 属性查询(例如foo.bar)
- 方法调用(例如foo.bar())
- 列表索引查找(例如,foo [2])
系统使用有效的第一种查找类型。这是短路逻辑。
回答 3
您需要在此处找到(或定义)“ get”模板标签。
标签定义:
@register.filter
def hash(h, key):
return h[key]
它的用法如下:
{% for o in objects %}
<li>{{ dictionary|hash:o.id }}</li>
{% endfor %}
回答 4
使用字典项目:
{% for key, value in my_dictionay.items %}
<li>{{ key }} : {{ value }}</li>
{% endfor %}
回答 5
django_template_filter 过滤器名称get_value_from_dict
{{ your_dict|get_value_from_dict:your_key }}
回答 6
类似于@russian_spy的回答:
<ul>
{% for choice in choices.items %}
<li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>
这可能适合分解更复杂的字典。
回答 7
理想情况下,您将在以投票方式发现自己的选择对象上创建方法,或者在模型之间创建关系。执行字典查找的模板标记也将起作用。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。