如何访问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> 

这可能适合打破更复杂的字典。