【问题标题】:Use variable as dictionary key in Django template在 Django 模板中使用变量作为字典键
【发布时间】:2023-03-19 10:02:01
【问题描述】:

我想在 Django 模板的字典中使用一个变量作为键。我无法为我的生活弄清楚如何去做。如果我有一个带有名称或 ID 字段的产品,以及带有产品 ID 索引的评级字典,我想说:

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

在 python 中,这将通过一个简单的方法来完成

ratings[product.id]

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

【问题讨论】:

标签: django django-templates


【解决方案1】:

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

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

用法:

{{dictionary|keyvalue:key_variable}}

【讨论】:

  • 您还需要一堆外围设备才能完成这项工作,因此请务必查看文档:docs.djangoproject.com/en/dev/howto/custom-template-tags
  • 这可以链接嵌套字典吗? {{dictionary|keyvalue:key_variable|keyvalue:another_key}} 之类的东西?
  • 理论上可以,试试看;)
  • 这是一件微不足道的事情。为什么 django 不支持这个开箱即用?
  • @mango 因为他们希望远离模板中的logic,并鼓励将其放在视图中
【解决方案2】:

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

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

【讨论】:

  • 谢谢cji!我试图避免另一个对象,但这并不重要......反正它都被缓存了。
  • 您不需要在视图中准备数据,您可以通过在上下文中已经存在的字典上调用 items 来实现相同的目的 -- {% for product, rating in product_list.items %} 将起作用。跨度>
【解决方案3】:

有一个非常肮脏的解决方案:

<div>We need d[{{ k }}]</div>

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

【讨论】:

    【解决方案4】:

    基于 eviltnan 的回答,如果 key 不是 dict 的键,他的过滤器将引发异常。

    过滤器不应该引发异常,但应该fail gracefully。这是一个更强大/更完整的答案:

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

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

    【讨论】:

    • 而不是 dict[key] 您只需使用内置的 python 字典 get 方法。例如:返回 dict.get(key, '')
    • 您还应该捕获潜在的 TypeError。参数“dict”不保证是 Python dict。
    猜你喜欢
    • 2011-11-25
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多