Django模板中如何通过模型PK获取字典对应值?
解决Django模板中通过模型PK变量从字典取值的问题
这个问题我之前也碰到过,核心原因是Django模板的点语法不支持直接将变量作为字典键来取值,咱们来一步步拆解解决:
为什么会出现这个问题?
当你在模板里写{{ dictionary.model.pk }}时,Django的模板引擎会按这个逻辑解析:
- 先尝试获取
dictionary对象的model属性(而不是把model当作字典的键) - 再尝试获取
model对象的pk属性
完全不是你想要的「用model.pk的数值作为键去字典里查值」的逻辑。
而{{ dictionary.1 }}能生效,是因为模板引擎会把.1识别为整数类型的键,直接去字典里匹配对应键值对,这是点语法针对数字键的特殊处理。
两种可行的解决方法
方法1:使用Django内置的{% lookup %}标签(推荐,Django 1.11+可用)
Django官方提供了专门用于通过变量键查找字典值的模板标签,用法很简单:
{% lookup dictionary model.pk as target_value %} {{ target_value }}
这个标签会直接把model.pk的取值作为键,去dictionary里查找对应的值,完美匹配你的需求。
方法2:自定义模板过滤器
如果你的Django版本较低(低于1.11),或者更习惯用过滤器的方式,可以自己写一个简单的过滤器:
- 在你的Django app下创建
templatetags目录(如果没有的话),并添加__init__.py文件(空文件即可)。 - 在
templatetags目录下创建custom_filters.py,写入以下代码:
from django import template register = template.Library() @register.filter def get_item(dictionary, key): # 用get方法避免键不存在时报错,返回None或者你指定的默认值 return dictionary.get(key, None)
- 在需要使用的模板开头加载这个过滤器:
{% load custom_filters %}
- 然后就可以用过滤器来取值了:
{{ dictionary|get_item:model.pk }}
额外提示
如果你的字典键是字符串类型的(比如模型PK被转成了字符串),记得确保model.pk的类型和字典键的类型一致,否则也会出现取不到值的情况(比如键是"1"但model.pk是整数1),这种情况下可以在过滤器里做个类型转换,或者传递参数时统一类型。
内容的提问来源于stack exchange,提问作者Dario Muñoz
相关产品推荐
相关产品推荐

