Ajax GET请求调用Django视图时无法获取传递的参数值如何解决?
问题根因
- GET请求的参数是拼接在URL后的查询字符串,不会被封装到
request.data中,request.data仅用于读取POST、PUT等携带请求体的请求参数。 - Django REST Framework 中GET请求参数需要从
request.query_params中读取,等价于Django原生的request.GET对象,直接从request.data取参数会触发KeyError,导致服务端返回500错误。
修复方案
1. 修改Django视图代码
将取值逻辑修改为从query_params读取,建议用get方法设置默认值避免参数缺失时再次报错:
@csrf_exempt @api_view(['GET', 'POST', 'PUT', 'DELETE']) @permission_classes([IsAuthenticated]) @authentication_classes([TokenAuthentication]) def employee_list(request): if request.method == 'GET': # 仅需修改这一行取值逻辑 data_ = request.query_params.get('designation', '') print(data_) # 后续可按需用拿到的参数过滤查询集,示例: # employees = Employee.objects.filter(designation=data_) employees = Employee.objects.all() students = Student.objects.all() user = MyUser.objects.all() serializer = EmployeeSerializer(employees, many=True) serialized_sudents = StudentSerializer(students, many=True) multi = { 'employees': serializer.data, 'students': serialized_sudents.data } # serializer2 = UserSerializer(user, many=True) return JsonResponse(multi, safe=False)
2. 前端AJAX可选优化(非必须,仅冗余清理)
GET请求没有请求体,不需要设置contentType: "application/json",可删除该冗余配置:
$(document).ready(function () { $(".call_ajax").click(function () { $.ajax({ url: "/employee_list", type: "GET", // 删掉冗余的contentType配置即可 dataType: "json", data: { designation: "soft eng", }, headers: { "X-CSRFToken": csrftoken, Authorization: my_token, }, success: function (data) { console.log(data); }, error: function (xhr) { //Do Something to handle error console.log(xhr.error); }, }); });
验证
修改完成后前端发起请求时,参数会自动拼接为http://127.0.0.1:8000/employee_list?designation=soft+eng,后端可正常读取参数完成后续查询逻辑。
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

