如何使用$.ajax正确发送嵌套对象?(Django+jQuery环境)
解决jQuery $.ajax发送嵌套对象被扁平化的问题
问题根源
FormData本质是键值对集合,无法直接存储嵌套对象;jQuery默认会将对象序列化为表单提交的键值对格式(如data_origin[manual][0][comment]),而非JSON嵌套结构。你控制台看到的"正确嵌套结构"其实是你构建的原始对象,并非FormData中实际存储的内容。
解决方案
根据是否需要上传文件,分两种情况处理:
情况1:需要上传文件(必须用FormData)
将嵌套对象转为JSON字符串,作为FormData的一个字段发送,后端再解析这个字符串:
前端代码
// 构建嵌套对象 const dataOrigin = { manual: [ { comment: "测试评论" } // 其他嵌套内容 ] }; const formData = new FormData(); // 把嵌套对象转为JSON字符串存入FormData formData.append('data_origin', JSON.stringify(dataOrigin)); // 追加其他表单字段或文件 // formData.append('file', document.getElementById('file-input').files[0]); $.ajax({ url: '/你的接口路径/', method: 'POST', data: formData, processData: false, // 禁用jQuery对数据的自动处理,必须设置 contentType: false, // 让浏览器自动设置正确的Content-Type,必须设置 success: res => console.log(res), error: xhr => console.error(xhr.responseText) });
Django后端代码
import json from django.http import JsonResponse def your_view(request): if request.method == 'POST': data_origin_str = request.POST.get('data_origin') if not data_origin_str: return JsonResponse({'error': '缺少data_origin字段'}, status=400) try: data_origin = json.loads(data_origin_str) # 这里可以处理嵌套结构的数据了 print(data_origin['manual'][0]['comment']) # 输出:测试评论 return JsonResponse({'status': 'success'}) except json.JSONDecodeError: return JsonResponse({'error': 'data_origin格式错误'}, status=400)
情况2:不需要上传文件(无需用FormData)
直接发送JSON格式的请求体,更简洁高效:
前端代码
const postData = { // 其他普通字段 username: 'test_user', // 嵌套对象 data_origin: { manual: [ { comment: "测试评论" } ] } }; $.ajax({ url: '/你的接口路径/', method: 'POST', data: JSON.stringify(postData), contentType: 'application/json', // 明确告诉后端是JSON格式 success: res => console.log(res), error: xhr => console.error(xhr.responseText) });
Django后端代码
import json from django.http import JsonResponse def your_view(request): if request.method == 'POST': try: post_data = json.loads(request.body) data_origin = post_data.get('data_origin') # 处理嵌套数据 print(data_origin['manual'][0]['comment']) # 输出:测试评论 return JsonResponse({'status': 'success'}) except json.JSONDecodeError: return JsonResponse({'error': '请求体格式错误'}, status=400)
内容的提问来源于stack exchange,提问作者Eric Luther
相关产品推荐
相关产品推荐

