Django DRF接收jQuery POST JSON数据格式异常问题排查
问题:jQuery POST请求数据格式异常,Django接收为QueryDict键值异常
当我尝试通过jQuery发送POST请求时,前端控制台及表单数据均显示:
{ "wo_r": [ { "pk": "17635" }, { "pk": "17637" } ] }但Django Shell中读取到的却是:
<QueryDict: {'{\n "wo_r": [\n {\n "pk": "17635"\n },\n {\n "pk": "17637"\n }\n ]\n}': ['']}>
问题根源
你这里的核心问题是对jQuery的data参数处理逻辑理解偏差。你用JSON.stringify(dict, null, 2)把JS对象转成了格式化的JSON字符串,然后直接把这个字符串传给data——但jQuery默认会把data的内容按照application/x-www-form-urlencoded(表单编码)格式来处理。
这就导致整个JSON字符串被当成了一个表单字段的键名,而对应的值是空的,所以Django那边收到的QueryDict就出现了把长JSON字符串作为键、值为['']的异常情况。
解决方案
这里给你两种可行的处理方式,根据你的后端接收需求选择:
方案1:直接传递JS对象(推荐,适配Django默认表单解析)
不需要做JSON.stringify转换,直接把你的dict对象传给data参数即可。jQuery会自动把嵌套对象编码成Django能识别的表单格式(比如wo_r[0][pk]=17635这种结构),QueryDict能正常解析出嵌套数据:
// 去掉JSON.stringify步骤,直接传递原始对象 creaol(indirizzo, dict);
你注释掉的那段代码能正常工作,就是因为用的是这种方式——直接传JS对象,jQuery帮你做了正确的编码。
方案2:发送纯JSON格式请求(适合后端期望接收JSON体的场景)
如果你的后端明确要接收JSON格式的请求体,需要手动设置请求头,并确保传递的是JSON字符串:
function creaol(indirizzo, val) { $.ajax({ url: indirizzo, type: 'POST', dataType:'json', global: false, contentType: 'application/json', // 关键:告诉后端这是JSON格式的请求体 data : val, success: function(result) { // 处理返回结果 } }); } var dati = JSON.stringify(dict, null, 2); creaol(indirizzo, dati );
同时在Django后端,需要从请求体中读取原始JSON数据,而不是用request.POST:
import json from django.http import JsonResponse def your_view(request): if request.method == 'POST': # 从请求体加载JSON数据 data = json.loads(request.body) wo_r_list = data.get('wo_r', []) # 后续业务逻辑处理 return JsonResponse({'status': 'success', 'data': wo_r_list})
内容的提问来源于stack exchange,提问作者user2239318
相关产品推荐
相关产品推荐

