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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:10:11