如何访问Django模板中的字典元素?
我在模板中有这个代码,我想打印出每个select得到的票数。 票是只字典,而select是模型对象。
{% for choice in choices %} {{choice.choice}} - {{votes[choice.id]}} <br /> {% endfor %}
它引发了一个exception,这个消息“无法parsing余数”
为了回应/延伸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 %}
模板标签,恕我直言,这个解决scheme有点矫枉过正,但它也不是一个可怕的解决scheme。 Django中的模板的目标是让你远离模板中的代码,反之亦然。
我会尝试上面的方法,看看ORM生成的SQL,因为我不知道如果它将预先caching的属性,只是为该属性创build一个子select,或者如果它将迭代/ on-按需运行查询来计算投票计数。 但是,如果它产生了强烈的查询,你可以随时使用你自己收集的数据填充你的视图中的属性。
choices = {'key1':'val1', 'key2':'val2'}
这是模板:
<UL> {关键%,choices.items%} <li> {{key}} - {{value}} </ li> {%endfor%} </ UL>
基本上, .items
是一个Django关键字,它将字典分成(键,值)对的列表。 这使得迭代Django模板中的字典。
你可以使用点符号:
点查找可以这样概括:当模板系统在variables名中遇到一个点时,它按以下顺序尝试以下查找:
- 字典查找(例如,foo [“bar”])
- 属性查找(例如,foo.bar)
- 方法调用(例如,foo.bar())
- 列表索引查找(例如,foo [2])
系统使用可用的第一个查找types。 这是短路逻辑。
例如,您需要在这里find(或定义)一个'get'模板标签。
标签定义:
@register.filter def hash(h, key): return h[key]
它的用法如下:
{% for o in objects %} <li>{{ dictionary|hash:o.id }}</li> {% endfor %}
理想情况下,您可以在select对象上创build一个方法,并在模型中创build关系。 执行字典查找的模板标签也可以工作。
django_template_filterfilter名称get_value_from_dict
{{ your_dict|get_value_from_dict:your_key }}
类似于@russian_spy的答案:
<ul> {% for choice in choices.items %} <li>{{choice.0}} - {{choice.1}}</li> {% endfor %} </ul>
这可能适合打破更复杂的字典。