无法将 Ajax GET 调用中的数据值检索到 Django 视图中

Posted

技术标签:

【中文标题】无法将 Ajax GET 调用中的数据值检索到 Django 视图中【英文标题】:Not able to retrieve data values from Ajax GET call into Django view 【发布时间】:2021-09-22 04:05:57 【问题描述】:

我正在尝试根据我发送的参数查询员工列表 通过数据内部的ajax调用,但它给了我一个错误(我想要它 仅通过 GET 请求)

Js ajax 函数

  $(document).ready(function () 
    $(".call_ajax").click(function () 
      $.ajax(
        url: "/employee_list",
        type: "GET",
        contentType: "application/json",
        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);
        ,
      );
    );

我的看法

@csrf_exempt
@api_view(['GET', 'POST', 'PUT', 'DELETE'])
@permission_classes([IsAuthenticated])
@authentication_classes([TokenAuthentication])
def employee_list(request):

    if request.method == 'GET':
        data_ = request.data['designation']
        print(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)

我在浏览器中遇到错误

GET http://127.0.0.1:8000/employee_list/ 500 (Internal Server Error)

Django 日志中的错误

 File "C:\Users\atif\PycharmProjects\CodePlatform\syntax_fight\api_\views.py", line 42, in employee_list
    data_ = request.data['designation']
KeyError: 'designation'

【问题讨论】:

【参考方案1】:

这很可能是因为您使用的是GET,但数据位于正文中。看看this。要尝试解决此问题,请将您的请求方法更改为POST

      $.ajax(
        url: "/employee_list",
        type: "POST",
        ...

【讨论】:

【参考方案2】:

request.data 返回请求正文的解析内容。 这类似于标准的request.POST 和 request.FILES

你可以使用request.GET.get('designation')

@csrf_exempt
@api_view(['GET', 'POST', 'PUT', 'DELETE'])
@permission_classes([IsAuthenticated])
@authentication_classes([TokenAuthentication])
def employee_list(request):

    if request.method == 'GET':
        data_ = request.GET.get('designation') # Here I made changes
        print(data_)
        employees = Employee.objects.filter(designation=data_) # Map parsed data with database field
        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)

您可以覆盖 get_queryset 方法。至于查询字符串参数request.data保存的是POST数据,可以通过request.query_params获取查询字符串参数

def get_queryset(self):
    data = self.request.query_params.get('designation')
    queryset = Model.objects.filter() # use whatever you want filter
    return queryset

要了解更多关于 request.data 和 request.query_params,这里是链接 Request parsing link

【讨论】:

但它返回空字典 从 request.GET 中检索数据后,您没有使用数据来过滤数据库。从 request.GET 方法检索数据后,使用该数据过滤数据库。我对答案进行了更改

以上是关于无法将 Ajax GET 调用中的数据值检索到 Django 视图中的主要内容,如果未能解决你的问题,请参考以下文章

jquery-无法从我通过ajax调用获得的对象类型响应中检索数据

从通过 jQuery/jQueryMobile 中的 AJAX 调用检索到的 JSON 数据正确设置变量

从数据库中检索数据并将其发送到 laravel 中的 ajax

为啥不能将父ajax调用的参数访问到子ajax调用中

ExtJS - AJAX 调用后无法重新加载组合

无法从 C 中的 Berkeley DB 检索值