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

Django模板按序渲染字典列表时通过变量键访问字典值的方法

问题原因

Django模板语法不支持向方法传递变量参数,你写的{{ item.get(key) }}无法正常解析:模板引擎遇到.操作符时,只会按固定优先级做无参解析:

  • 优先查找对应名称的字典键
  • 其次查找对象属性、无参方法(会自动调用)
  • 最后尝试按列表索引解析
    dict.get()是需要传入key参数的方法,模板环境下无法传入动态变量完成调用,所以取值失败。
    另外你贴的视图代码有缩进错误:context字典定义、return render(...)两行没有缩进在UserGoalstatus函数体内,运行时会直接抛作用域异常,先修正这个缩进问题再调试模板逻辑。
可行方案

方案1:自定义模板过滤器(通用度最高,推荐)

这是Django框架下处理动态key字典取值的标准实现:

  1. 在对应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, '')
  1. 在html模板最顶部加载自定义标签库:
{% load dict_tags %}
  1. 将原来的取值代码替换为过滤器调用写法即可:
<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:42:13