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

Moh*_*med 170 python django django-templates

我在模板中有这个代码,我想打印出每个选项得到的票数.投票只是字典而选择是模型对象.

{% for choice in choices %}
    {{choice.choice}} - {{votes[choice.id]}} <br />
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

它引发了一条异常,显示"无法解析余数"

rus*_*spy 268

choices = {'key1':'val1', 'key2':'val2'}
Run Code Online (Sandbox Code Playgroud)

这是模板:

<ul>
{% for key, value in choices.items %} 
  <li>{{key}} - {{value}}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

基本上,.items是一个Django关键字,它将字典拆分为(键,值)对列表.这允许在Django模板中对字典进行迭代.

  • 这个问题的简洁解决方案.为了澄清,`items`是字典上的Python方法调用,而不是Django关键字.正如[Alex Martelli指出](http://stackoverflow.com/a/3744713/1174169)它与`iteritems`基本相同.正如Wilhelm回答的那样,字典查找在点查找中排在第3位.如果您的词典中有一个名为"'items'"的项目,那么您将获得该值而不是元组列表.要测试:在你的字典中添加`{'items':'oops'}`,你会得到一个带有项目符号列表的'oops'字母 (5认同)

Wil*_*elm 172

你可以使用点符号:

点查找可以这样概括:当模板系统遇到变量名中的点时,它会按以下顺序尝试以下查找:

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

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

  • 在他的情况下,选择是一个变量.执行.choice将查找键"choice"的值,而不是键选择的值. (44认同)
  • 这甚至适用于嵌套字典。Python 代码:`my_dict[1][2]` 模板代码:`my_dict.1.2` (3认同)
  • @JCLeitão因为正确的版本是`d.key.1` - 请注意第二个`.` (2认同)
  • 检查文档虽然...来自"1.6 https://docs.djangoproject.com/en/1.6/topics/templates/#variables":注意模板表达式中的"bar",如{{foo.bar}如果模板上下文中存在一个,则将被解释为文字字符串而不使用变量"bar"的值. (2认同)

小智 61

为了回应/扩展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)
Run Code Online (Sandbox Code Playgroud)

然后在您的模板中,您可以执行以下操作:

    {% for choice in choices %}
            {{choice.choice}} - {{choice.votes}} <br />
    {% endfor %}
Run Code Online (Sandbox Code Playgroud)

模板标签,恕我直言,这个解决方案有点矫枉过正,但它也不是一个可怕的解决方案.Django中模板的目标是使您与模板中的代码隔离,反之亦然.

我会尝试上面的方法,看看ORM生成了什么SQL,因为我不确定它是否会预先缓存属性,只是为属性创建一个子选择,或者它是否会迭代/开启 - 需求运行查询以计算投票计数.但是,如果它生成了残酷的查询,您可以随时使用自己收集的数据填充视图中的属性.

  • 虽然它确实有效,但效率不高.它在循环中进行sql查询(你应该避免的).创建自己的标签来执行dict查找很简单:@register.filter def lookup(d,key):如果d和isinstance(d,dict):return d.get(key) (4认同)

Ned*_*der 22

您需要找到(或定义)'get'模板标签,例如,此处.

标签定义:

@register.filter
def hash(h, key):
    return h[key]
Run Code Online (Sandbox Code Playgroud)

它的使用方式如下:

{% for o in objects %}
  <li>{{ dictionary|hash:o.id }}</li>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 考虑由于KeyError导致的h.get(key,'default_value')` (3认同)

Ada*_*rrh 8

类似于@russian_spy 的回答:

<ul>
{% for choice in choices.items %} 
  <li>{{choice.0}} - {{choice.1}}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

这可能适合分解更复杂的字典。


Pri*_*han 7

使用字典项目

        {% for key, value in my_dictionay.items %}
          <li>{{ key }} : {{ value }}</li>
        {% endfor %}
Run Code Online (Sandbox Code Playgroud)


小智 6

django_template_filter 过滤器名称get_value_from_dict

{{ your_dict|get_value_from_dict:your_key }}
Run Code Online (Sandbox Code Playgroud)