Django模板如何用变量查找字典值
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 }}