Django模板按序渲染字典列表时通过变量键访问字典值的方法
问题原因
Django模板语法不支持向方法传递变量参数,你写的{{ item.get(key) }}无法正常解析:模板引擎遇到.操作符时,只会按固定优先级做无参解析:
- 优先查找对应名称的字典键
- 其次查找对象属性、无参方法(会自动调用)
- 最后尝试按列表索引解析
dict.get()是需要传入key参数的方法,模板环境下无法传入动态变量完成调用,所以取值失败。
另外你贴的视图代码有缩进错误:context字典定义、return render(...)两行没有缩进在UserGoalstatus函数体内,运行时会直接抛作用域异常,先修正这个缩进问题再调试模板逻辑。
可行方案
方案1:自定义模板过滤器(通用度最高,推荐)
这是Django框架下处理动态key字典取值的标准实现:
- 在对应app目录下创建
templatetags目录,目录内新建空文件__init__.py标记为Python包,再新建dict_tags.py写入以下代码:
from django import template register = template.Library() @register.filter def get_item(dictionary, key): return dictionary.get(key, '')
- 在html模板最顶部加载自定义标签库:
{% load dict_tags %}
- 将原来的取值代码替换为过滤器调用写法即可:
<td>{{ item|get_item:key }}</td>
方案2:视图层提前规整数据(无需自定义标签)
如果不想新增模板标签,可以直接在视图层把数据整理成模板可以直接渲染的结构,不需要在模板内做动态key查找:
修改视图逻辑,在拿到排序后的key顺序后,把每条字典转成对应顺序的值列表:
def UserGoalstatus(request, promise_token): print("__UserGoalstatus__") from cmd_utils import Retrieve_goal data = Retrieve_goal(promise_token) keys = set() for item in data: keys.update(set(item)) key_order = sorted(keys) # 按排序后的键重组数据 ordered_rows = [] for item in data: ordered_rows.append([item.get(k, '') for k in key_order]) context = { "key_order": key_order, "ordered_rows": ordered_rows, } return render(request, 'json_table.html', context)
对应模板的tbody部分直接循环取值即可:
<tbody> {% for row in ordered_rows %} <tr> {% for value in row %} <td>{{ value }}</td> {% endfor %} </tr> {% endfor %} </tbody>
补充说明
你当前返回的数据中properties字段是嵌套字典,如果后续需要渲染该字段下的子属性,要么在视图层提前把嵌套字段拍平为一级字典,要么扩展自定义过滤器支持嵌套key查找即可。
内容的提问来源于stack exchange,提问作者Jia
相关产品推荐
相关产品推荐

