Django中使用AJAX发送POST请求后端得到空字典如何解决?
你遇到的问题核心是 AJAX请求的Content-Type配置与Django后端取值逻辑不匹配:
你在AJAX中指定了contentType: "application/json",表示要传JSON格式的请求体,但Django的request.POST仅支持解析application/x-www-form-urlencoded和multipart/form-data格式的请求数据,所以拿不到你传的skill_id参数。
方案1(改动最小,推荐):删除AJAX中的自定义contentType配置
jQuery发送AJAX的默认contentType就是application/x-www-form-urlencoded,刚好适配Django的request.POST取值逻辑,直接删掉对应行即可:
let delete_class_list = $('.delete_skill') delete_class_list.click(function(e){ let value = this.getAttribute("data-attr") // 可加打印确认前端拿到了正确的id console.log('要删除的技能id:', value) let contain_icon = this let contain_label = contain_icon.parentElement.previousSibling $.ajax({ url:'/delete_skill/', method : 'POST', data: { skill_id:value }, dataType: "json", // 删掉下面这行contentType配置即可 // contentType: "application/json", success :function(data){ console.log(data) contain_label.remove() contain_icon.remove() }, error:function(e){ console.log(e) } }) })
这个方案不需要改动后端视图代码,原有逻辑可以直接生效。另外建议你模板中的data-attr属性加双引号包裹,避免特殊值出现解析异常:
<i class="fas fa-trash-alt delete_skill" data-attr="{{skills.id}}" style="cursor: pointer;"></i>
方案2:保留JSON传参格式,修改后端取值逻辑
如果你确实需要用JSON格式传参,就需要在后端手动解析request.body中的JSON数据:
import json from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from .models import Job_Skillset from django.core.exceptions import ObjectDoesNotExist @csrf_exempt def delete_skill(request): if request.method == 'POST': data = {} # 解析JSON格式的请求体 req_data = json.loads(request.body) job_id = req_data.get('skill_id') print(job_id) try: Job_Skillset.objects.get(id=job_id).delete() data['status'] = 'deleted' except ObjectDoesNotExist: data['status'] = 'nodata' return JsonResponse(data,safe=False)
这个方案不需要改动前端AJAX代码。
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

