Django模板中如何用动态变量作为嵌套字典的键取值
Django模板使用变量作为字典键动态取值的实现方案
这个需求完全可以实现,Django模板默认不支持直接用变量作为字典键的点语法取值,我们可以通过自定义模板过滤器的方式实现该需求,也可以通过视图层预处理数据规避模板层的复杂取值操作。
方案1:自定义模板过滤器(推荐)
- 首先在你的Django应用目录下创建
templatetags文件夹,在文件夹内新增空文件__init__.py,再新建自定义过滤器文件,例如common_filters.py,写入以下代码:
from django import template register = template.Library() @register.filter def get_val(dict_obj, key): # 支持字典取值,不存在时返回None避免报错 return dict_obj.get(key)
- 在模板顶部引入你定义的过滤器:
{% load common_filters %}
- 替换模板中的取值代码,嵌套使用过滤器即可实现动态嵌套字典取值:
{{ ans|get_val:question.pk|get_val:option.pk }}
你的原模板对应部分修改后如下,额外添加了floatformat:2过滤器用来保留两位小数,避免显示过长的小数位:
<li> {{ forloop.counter }}) {{option.text}}: {{ ans|get_val:question.pk|get_val:option.pk | floatformat:2 }} %. </li>
方案2:视图层预处理数据
如果不想额外编写模板过滤器,也可以在视图层提前把数据结构整合,将每个选项对应的百分比值提前绑定到option对象或者重组为方便遍历的结构,模板层直接遍历取值即可,这种方式性能更优,也减少了模板层的逻辑复杂度。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

