Django模板接收JSON数据为空,如何获取属性名对应值?
嘿,这个问题我之前帮人解决过,大概率是Django模板语法的小坑导致的!我给你两种靠谱的解决方案,再帮你排查下常见问题:
先确认你的Views代码是否正确
首先要保证你在views.py里已经把JSON字符串解析成了Python字典,而不是直接传递原始的JSON字符串——模板没法直接解析JSON文本哦。举个正确的例子:
import json from django.shortcuts import render def your_view(request): # 假设你从接口/文件拿到JSON字符串 raw_json = '{"username": "rohillasarthak", "email": "test@example.com", "role": "dev"}' # 解析为Python字典 parsed_data = json.loads(raw_json) # 你的属性名列表 attr_names = ["username", "email", "role"] # 传递到模板 return render(request, "your_template.html", {"data": parsed_data, "attrs": attr_names})
解决方案1:自定义模板过滤器(推荐)
Django模板默认不支持{{ data[attr] }}这种动态取字典键的写法,所以我们可以写个简单的过滤器来实现:
- 在你的Django app里创建
templatetags文件夹(记得加__init__.py空文件),然后新建custom_filters.py:
from django import template register = template.Library() @register.filter(name="get_value") def get_value_from_dict(dictionary, key): # 用get方法避免键不存在时报错,返回空字符串兜底 return dictionary.get(key, "")
- 在模板顶部加载这个过滤器:
{% load custom_filters %}
- 循环属性列表取值:
{% for attr in attrs %} <p>*{{ attr }}*: {{ data|get_value:attr }}</p> {% endfor %}
解决方案2:在Views里提前组装好键值对
如果不想写过滤器,也可以在views里直接把属性名和对应值打包好再传给模板:
def your_view(request): raw_json = '{"username": "rohillasarthak", "email": "test@example.com", "role": "dev"}' parsed_data = json.loads(raw_json) attr_names = ["username", "email", "role"] # 组装成(属性名, 属性值)的列表 attr_value_pairs = [(attr, parsed_data.get(attr, "")) for attr in attr_names] return render(request, "your_template.html", {"pairs": attr_value_pairs})
然后模板里直接循环:
{% for attr, value in pairs %} <p>*{{ attr }}*: {{ value }}</p> {% endfor %}
常见坑点排查
- 检查
parsed_data是不是真的字典:可以在模板里临时加{{ data }}打印出来,如果显示的是类似{'username': 'xxx'}的格式就是对的,如果是一串带引号的文本,说明你没解析JSON。 - 核对属性名的大小写和拼写:JSON的键是区分大小写的!比如JSON里是
"Username",你列表里写"username"肯定取不到值。 - 嵌套属性的处理:如果你的JSON有嵌套(比如
{"user": {"name": "xxx"}}),那属性列表里的"user.name"需要额外处理——可以在过滤器里拆分点号,或者在views里提前取出嵌套值。
内容的提问来源于stack exchange,提问作者rohillasarthak
相关产品推荐
相关产品推荐

