一尘不染

如何在Django模板中访问字典元素?

django

我想打印出每个选择获得的票数。我在模板中有以下代码:

{% for choice in choices %}
    {{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}

votes只是一个字典,而choices只是一个模型对象。

该消息引发异常:

"Could not parse the remainder"

阅读 477

收藏
2020-03-26

共3个答案

一尘不染

为了回应/扩展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,因为我不确定它是否会预缓存属性并为该属性创建子选择,还是会迭代/启用-需求运行查询以计算投票数。但是,如果它产生了残酷的查询,你总是可以使用自己收集的数据填充视图中的属性。

2020-03-26
一尘不染

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模板中的字典上进行迭代。

2020-03-26
一尘不染

你可以使用点符号:

点查找可以总结如下:当模板系统遇到变量名称中的点时,它将按以下顺序尝试以下查找:

  • 字典查找(例如foo [“ bar”])
  • 属性查询(例如,foo.bar)
  • 方法调用(例如foo.bar())
  • 列表索引查找(例如foo [2])

系统使用有效的第一种查找类型。这是短路逻辑。

2020-03-26