首页 文章

在Django模板中使用变量作为字典键

提问于
浏览
49

我想在Django模板中使用变量作为字典中的键 . 我不能为我的生活弄明白该怎么做 . 如果我有一个带有名称或ID字段的产品,以及带有产品ID索引的评级字典,我希望能够说:

{% for product in product_list %}
     <h1>{{ ratings.product.id }}</h1>
{% endfor %}

在python中,这将通过简单的方式完成

ratings[product.id]

但我不能让它在模板中工作 . 我试过用...没有骰子 . 想法?

4 回答

  • 75

    像这样创建一个模板标签(在你的项目/模板标签中):

    @register.filter
    def keyvalue(dict, key):    
        return dict[key]
    

    用法:

    {{dictionary|keyvalue:key_variable}}
    
  • 19

    有一个 very dirty 解决方案:

    <div>We need d[{{ k }}]</div>
    
    <div>So here it is:
    {% for key, value in d.items %}
        {% if k == key %}
            {{ value }}
        {% endif %}
    {% endfor %}
    </div>
    
  • 12

    您需要事先准备好数据,在这种情况下,您应该将两元组列表传递给您的模板:

    {% for product, rating in product_list %}
        <h1>{{ product.name }}</h1><p>{{ rating }}</p>
    {% endfor %}
    
  • 7

    基于eviltnan的答案,如果 key 不是 dict 的关键字,他的过滤器将引发异常 .

    过滤器永远不应该引发异常,但应该fail gracefully . 这是一个更健壮/完整的答案:

    @register.filter
    def keyvalue(dict, key):    
        try:
            return dict[key]
        except KeyError:
            return ''
    

    基本上,这与Python代码中的 dict.get(key, '') 相同,如果您不想包含try / except块,也可以这样编写,尽管它更明确 .

相关问题