Django不使用DRF如何将Python对象转换为标准JSON返回前端页面
问题原因
- 你遇到的
context must be a dict rather than JsonResponse报错,是因为JsonResponse是Django封装的用于直接返回JSON接口响应的对象,不能放入render方法的上下文参数中,上下文仅支持传入普通Python对象供模板渲染使用。你当前贴出的代码是直接传入了原数据data到上下文,不会触发该报错,应该是此前尝试把JsonResponse实例a放入上下文才导致的报错。 - Python原生的布尔值
True/False、空值None直接传入模板渲染时,会按Python语法格式输出,不会自动转换为JSON标准要求的true/false、null格式。
解决方案
无需引入DRF,直接使用Python内置的json模块完成序列化即可:
视图代码修改
from django.shortcuts import render import json def send_json(request): data = [{'name': 'Peter', 'email': 'peter@example.org'}, {'name': 'Julia', 'email': 'julia@example.org'}, {'name': True, 'data': None}] # 将Python对象序列化为符合JSON标准的字符串 json_data = json.dumps(data) return render(request, 'index.html', {'a': json_data})
模板使用方法
- 若仅需要文本展示JSON内容,直接使用
{{ a }}输出即可,此时输出内容已经是标准JSON格式,True会转换为true、None会转换为null。 - 若需要将JSON赋值给JavaScript变量使用,需要加上
safe过滤器关闭Django的自动转义,避免引号等特殊字符被转义导致语法错误:
<script> // 直接解析为JS对象即可使用 const pageData = {{ a|safe }}; console.log(pageData); </script>
补充说明
如果你不需要渲染HTML页面,仅需要提供纯JSON接口,才需要使用JsonResponse,用法如下:
from django.http import JsonResponse def json_api(request): data = [{'name': 'Peter', 'email': 'peter@example.org'}] # 顶层数据为非字典类型时需要加safe=False参数 return JsonResponse(data, safe=False)
内容的提问来源于stack exchange,提问作者Krishna Manohar
相关产品推荐
相关产品推荐

