【问题标题】:400 (Bad Request) on an Ajax POST request using Django Rest Framework使用 Django Rest Framework 的 Ajax POST 请求出现 400(错误请求)
【发布时间】:2021-01-19 05:19:26
【问题描述】:

我想我会在这里问这个,因为我不太确定我哪里出错了。我正在尝试使用 Django Rest Framework 类通过 AJAX 发出 POST 请求。但是,每当事件触发时,我都会收到以下错误:

OST http://127.0.0.1:8000/api/uservenue/ 400 (Bad Request)

这是堆栈跟踪中出现的内容:

{"list":["This field is required."],"venue":["This field is required."]}

上下文

我试图做到这一点,当用户单击“添加到列表”按钮时,它会将 cafeName(以及最终的其他详细信息)发送到用户定义的列表。

我想知道是否有人可以查看我的代码并就我哪里出错了给我一些指导?

守则

以下是相关模型:

class UserVenue(models.Model):
    venue = models.ForeignKey(mapCafes, on_delete=models.PROTECT)  
    list = models.ForeignKey(UserList, on_delete=models.PROTECT)
Here is the relevant serializer.py

class UserVenueSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserVenue
        fields = ['list', 'venue']

这里是相关的网址

router = DefaultRouter() #need help understanding router register
router.register('userlist', views.UserList)
router.register('uservenue', views.UserVenue)

这里是相关的views.py

class UserVenue(viewsets.ModelViewSet):
    serializer_class = UserVenueSerializer
    queryset = UserVenue.objects.all()

    @ensure_csrf_cookie
    def get_queryset(self):
        cafeName = self.request.GET.get('cafeName', None)
        print(cafeName)

        return UserVenue.objects.all()

最后,这里是包含 CSRF 代码的 ajax 调用。

var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }


$.ajaxSetup({
    beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});


$.ajax({
  type: "POST",
   url : '/api/uservenue/',
   //dataType: "json", //I tried using this and commenting it out and it made no diff.
   //contentType: "application/json", //I tried using this and commenting it out and it made no diff.
   data: {
     'cafeName': cafeName,
     'list_id':  1,
     'csrfmiddlewaretoken': document.querySelector('input[name="csrfmiddlewaretoken"]').value,
   },

      success: function(data){
      //$("user-list").html(data);
      console.log('User clicked: ' +  data)

      },
      failure: function(errMsg) {
        alert(errMsg);
      }
    });

我不确定这是 Ajax 中的错误还是我的视图中的错误?

谢谢!

【问题讨论】:

  • 这可以很容易地用一个普通的 Django 视图函数来完成——你需要使用 Django 休息框架 Viewset 有什么特别的原因吗?
  • 嘿,不完全是。用户创建的列表功能是通过 DRF 完成的,所以我试图保持一致。我对使用 DRF 不知道,正在尝试,因为我还是很新,我收到的一些反馈是使用 DRF。你的意见是什么?
  • 让我们从下面的示例开始,并填补可能缺少的空白。

标签: jquery django ajax django-rest-framework


【解决方案1】:

原来我在隐藏一个变量。我已经导入了 UserVenue 并试图将类命名为 UserVenue 这导致了整体问题。

重命名为views.py类到UserVenueViewset修复了它。

【讨论】:

    【解决方案2】:

    让我们从一个简单的模式开始,我们可以深入到需要的地方:

    首先在您的 js 文件中,您需要执行以下操作:

    // js function is executed when button is clicked:
    function add_to_list() {
            
        // execute ajax request:
        $.ajax({
            url : 'add_to_list',
            method : 'POST',
            data : {
                csrfmiddlewaretoken: 'the_csrf_token',
                cafe_name : 'the_cafe_name',
                ...
            },
            success: add_to_list_success,
        });
        
    } $('#button-id').click(add_to_list);
    
    
    // executes on successfully contacting backend:
    function add_to_list_success(response) {
        
        // unpack response (context variable from view function)
        data = response.data;        
      
        ...     
    }
    

    然后,在您的 views.py 中,您可以执行以下操作:

    from django.http import HttpResponse
    import json
    
    def add_to_list(request):
        
        # unpack POST data:
        cafe_name = request.POST['cafe_name']
        ...
        
        # conduct other logic:
        ...
        
        # pack context:
        context = json.dumps({
           'data' : 'some_data'
        })
        
        return HttpResponse(context)
        
    

    当然,不要忘记将视图函数路由到 urls.py 中的 'add_to_list' url

    【讨论】:

    • 感谢您抽出宝贵的时间阅读此内容。我很感激。我最初的问题是,我在上面添加的 views.py 逻辑是否类似于我的 API 视图中的逻辑?
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多