You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板中如何通过模型PK获取字典对应值?

解决Django模板中通过模型PK变量从字典取值的问题

这个问题我之前也碰到过,核心原因是Django模板的点语法不支持直接将变量作为字典键来取值,咱们来一步步拆解解决:

为什么会出现这个问题?

当你在模板里写{{ dictionary.model.pk }}时,Django的模板引擎会按这个逻辑解析:

  1. 先尝试获取dictionary对象的model属性(而不是把model当作字典的键)
  2. 再尝试获取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),或者更习惯用过滤器的方式,可以自己写一个简单的过滤器:

  1. 在你的Django app下创建templatetags目录(如果没有的话),并添加__init__.py文件(空文件即可)。
  2. 在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)
  1. 在需要使用的模板开头加载这个过滤器:
{% load custom_filters %}
  1. 然后就可以用过滤器来取值了:
{{ dictionary|get_item:model.pk }}

额外提示

如果你的字典键是字符串类型的(比如模型PK被转成了字符串),记得确保model.pk的类型和字典键的类型一致,否则也会出现取不到值的情况(比如键是"1"但model.pk是整数1),这种情况下可以在过滤器里做个类型转换,或者传递参数时统一类型。

内容的提问来源于stack exchange,提问作者Dario Muñoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:28