簡體   English   中英

使用序列化程序在對 Django Rest-Api 的發布請求中獲取“錯誤請求”

[英]Getting “Bad Request” on the post request to Django Rest-Api using serializers

我正在嘗試使用 django-rest 框架將數據保存到 model 中。 我已經編寫了 api,當我使用 url 到 api 直接訪問它時,它工作正常。 但是當我嘗試使用 ajax 發布數據時出現錯誤請求錯誤。 如果在使用 api 接口插入數據時它可以正常工作,那么在使用 ajax 插入數據時它應該可以正常工作......但是我收到了一個錯誤的請求。

這是 AJAX 請求方法(Jquery):

$("form").submit(function(event){
           event.preventDefault();

            var this_ = $(this);
            var formData =this_.serialize();
            $.ajax({
                url: "/api/forum/posts/{{ post_question.thread_id.id }}/create",
                data: formData,
                method: "POST",
                success: function (data) {
                    console.log("successfully returned");
                    console.log(data);
                    displayPosts();

                },
         })

序列化器如下,在 api/serializers.py 中:

class ThreadModelSerializer(serializers.ModelSerializer):
    created_by = UserDisplaySerializer(read_only=True)
    class Meta:
       model = Thread
       fields = '__all__'


class PostModelSerializer(serializers.ModelSerializer):
    posted_by = UserDisplaySerializer(read_only=True)
    class Meta:
       model = Post
       fields = '__all__'

Post 和 Thread 的模型在 models.py 中如下所示:

class Thread(models.Model):
    thread_subject = models.CharField(max_length=250)
    posted_on = models.DateTimeField(auto_now=True)
    category = models.CharField(max_length=250)
    forum_id = models.ForeignKey(Forum, on_delete=models.CASCADE)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)


class Post(models.Model):
    post_message = models.TextField()
    thread_id = models.ForeignKey(Thread, on_delete=models.CASCADE)
    parent_id = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
    posted_on = models.DateTimeField(auto_now=True)
    posted_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

最后 API 視圖是這樣的,在 api/views.py 中:

class PostCreateApiView(generics.CreateAPIView):
    serializer_class = PostModelSerializer
    permission_classes = [permissions.IsAuthenticated]

    def perform_create(self, serializer, *args, **kwargs):
        thread_id = self.kwargs.get('thread_id', None)
        thread = get_object_or_404(Thread, id=thread_id)
        parent_post = get_object_or_404(Post, thread_id=thread_id, parent_id__isnull=True)

        serializer.save(posted_by=self.request.user, parent_id=parent_post, thread_id=thread)

和 url 路線在 api/urls.py 中如下:

    path('posts/<int:thread_id>/create', PostCreateApiView.as_view(), name='post_create'),

希望我能夠清楚地說明問題,需要幫助。 當我直接使用 api url 創建新帖子時,例如:

http://localhost:8000/api/forum/posts/4/create

我沒有收到任何錯誤,並且帖子已成功插入數據庫。

但是當我嘗試使用模板(ajax)插入數據時,例如:

http://localhost:8000/forums/thread/4/

我收到一個錯誤的請求,如下所示:

Bad Request: /api/forum/posts/4/create
HTTP POST /api/forum/posts/4/create 400 [0.02, 127.0.0.1:40630]

需要幫助,我很努力,但找不到解決方案。 等待回復。 謝謝。

我遇到了和你一樣的問題:只是一個 400 錯誤,沒有更多信息。

雖然我不知道您的問題到底是什么,但我可以告訴您,在您的 ajax 請求中添加錯誤 function 將幫助您調試它。

原因是您實際上並沒有導致 python 錯誤,您只是提出 Django Rest 框架認為錯誤的請求。 它會告訴您在 400 狀態代碼下返回的響應中有什么問題,因此未在 ajax 成功 function 中顯示,但在錯誤 ZC1C425268E68385D1AB5074C17A9F 中顯示。

$("form").submit(function(event){
       event.preventDefault();

        var this_ = $(this);
        var formData =this_.serialize();
        $.ajax({
            url: "/api/forum/posts/{{ post_question.thread_id.id }}/create",
            data: formData,
            method: "POST",
            success: function (data) {
                console.log("successfully returned");
                console.log(data);
                displayPosts();

            },
            error: function (jqXhr, textStatus, errorThrown) {
                console.log('ERROR')
                console.log(jqXhr)
            },
     })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM