Django模板如何用变量查找字典值

315 投票
11 回答
231079 浏览
提问于 2025-04-17 05:35
mydict = {"key1":"value1", "key2":"value2"}

在Django模板中,查找字典值的常用方法是用 {{ mydict.key1 }}{{ mydict.key2 }}。但是如果你要查找的键是一个循环变量,比如:

{% for item in list %} # where item has an attribute NAME
  {{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}

mydict.item.NAME 这样写会出错。那该怎么解决呢?

11 个回答

50

默认情况下,你是不能这样做的。点号(.)在这里是用来分隔或触发查找属性、键或者切片的。

在模板渲染中,点号有特别的含义。变量名中的点号表示要进行查找。具体来说,当模板系统在变量名中遇到点号时,它会按照以下顺序进行查找:

  • 字典查找。例如:foo["bar"]
  • 属性查找。例如:foo.bar
  • 列表索引查找。例如:foo[bar]

不过,你可以创建一个过滤器,让你传入一个参数:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

@register.filter(name='lookup')
def lookup(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}
95

在循环中同时获取字典中的键和值:

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}

我觉得这样写更容易理解,而且不需要特别复杂的代码。反正我在循环里通常都需要用到键和值。

467

编写一个自定义模板过滤器

from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

(我使用.get是为了在键不存在时返回空值。如果你用dictionary[key],就会出现KeyError错误。)

用法:

{{ mydict|get_item:item.NAME }}

撰写回答