Django模板运算顺序:如何动态通过变量键取字典值
Django模板动态获取字典键值的实现方法
Django模板原生的变量解析规则不支持{{ test.(object.id) }}这类用括号包裹动态表达式作为字典键的写法,默认点号语法仅支持直接传入固定属性名、固定键名,因此该写法无法正常渲染出结果。
你可以通过以下几种方式实现动态取值:
- 自定义模板过滤器(通用推荐方案)
- 在目标Django应用下创建
templatetags目录,在目录内新增空文件__init__.py标识该目录为Python包,再新建自定义标签文件比如dict_filters.py,写入以下代码:
from django import template register = template.Library() @register.filter def get_item(dictionary, key): return dictionary.get(key, "")- 在需要使用该功能的模板顶部,加载你写的自定义标签库:
{% load dict_filters %}- 调用时通过管道符传入动态键即可,写法如下:
当{{ test|get_item:object.id }}object.id值为example时,该写法等价于固定键写法{{ test.example }},会正确输出OK。 - 在目标Django应用下创建
- 视图层预处理取值
如果不想编写自定义模板标签,可以直接在后端视图逻辑中完成动态取值,把最终结果直接传给模板:
模板中直接使用def your_view(request): test_dict = {"example": "OK"} current_obj = YourModel.objects.get(pk=some_id) # 提前根据动态id取出对应值 target_value = test_dict.get(current_obj.id, "") return render(request, "your_template.html", { "test": test_dict, "object": current_obj, "target_value": target_value }){{ target_value }}即可拿到结果,这种方式把数据处理逻辑收拢在后端,模板层更简洁。 - 模板内循环匹配(仅适合小数据量场景)
如果既不想写自定义过滤器,也不想修改视图逻辑,可以在模板内遍历字典键值对做匹配:
该写法性能随字典键的数量上升而下降,仅适合字典条目极少的临时场景,不推荐常规使用。{% for k, v in test.items %} {% if k == object.id %} {{ v }} {% endif %} {% endfor %}
内容的提问来源于stack exchange,提问作者muhammad28813
相关产品推荐
相关产品推荐

