使用序列化程序获取对Django Rest-Api的发布请求中的“错误请求”

问题描述 投票:0回答:1

我正在尝试使用django-rest框架将数据保存到模型中。我已经编写了api,当我使用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();

                },
         })

Serializers如下,在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网址创建新帖子时,示例:

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]

需要帮助,我已经尽力了,但是找不到解决方案。等待回复。谢谢。

django ajax rest api bad-request
1个回答
0
投票

我遇到了与您完全相同的问题:仅有400错误,没有更多信息。

尽管我不知道您的问题到底是什么,但我可以告诉您,向您的ajax请求添加错误功能将有助于您对其进行调试。

原因是您实际上并没有引起python错误,您只是在请求Django Rest Framework错误。它会告诉您响应中出了什么问题,该响应是在400状态代码下返回的,因此没有显示在ajax成功函数中,而是显示在错误函数中。

$("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)
            },
     })
© www.soinside.com 2019 - 2024. All rights reserved.