Django REST在DELETE方法上给出403禁止,但在POST上不允许

Django REST在DELETE方法上给出403禁止,但在POST上不允许,django,django-rest-framework,Django,Django Rest Framework,我正在尝试使用ajax调用删除一个条目。 当我在泛型.DestroyAPIView中使用默认的“delete”方法时,我得到了一个403禁止,但是如果我添加了一个post方法,请立即调用delete方法,并将ajax类型更改为“post”,这样就可以了。有人知道是什么原因造成的吗 请注意,我覆盖了get_object函数,以根据发布的数据获取对象。(可能是因为删除不允许发布数据的方法?如果是,原因是什么?以及如何传递CSRF令牌??) 阿贾克斯: 网址: 视图: 序列化程序: class Pos

我正在尝试使用ajax调用删除一个条目。 当我在
泛型.DestroyAPIView
中使用默认的“delete”方法时,我得到了一个403禁止,但是如果我添加了一个post方法,请立即调用delete方法,并将ajax类型更改为“post”,这样就可以了。有人知道是什么原因造成的吗

请注意,我覆盖了get_object函数,以根据发布的数据获取对象。(可能是因为删除不允许发布数据的方法?如果是,原因是什么?以及如何传递CSRF令牌??)

阿贾克斯:

网址:

视图:

序列化程序:

class PostDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post_Detail
        fields = ['name', 'value']

403禁止的错误代码会以某种方式表明权限被拒绝或您未经身份验证

“DestroyAPIView”用于仅删除单个模型实例的API端点

你有完整的回溯,你可以附加到你的问题

文档引用


我得到的唯一错误是控制台:“禁止:/my/api/path/”和chrome控制台:“状态代码:403禁止”。请注意,我可以通过Django REST可浏览API自由删除条目,因此我的权限很好,而且似乎我也正确配置了API视图(因为它在可浏览API中工作正常)。问题始于我对同一API进行ajax调用。再一次如果我将类型从“DELETE”更改为“POST”,并将视图的POST函数更改为只调用DELETE函数;那么我的ajax调用就可以正常工作了。好吧,看看你的url.py文件,你的url似乎不是针对一个细节视图。详细视图通常由ID/PK(主键)、slug或UUID字段标识。最后,似乎有一个额外的右大括号。我没有在url中包含pk/id,因为要删除的对象由
名称
(在ajax调用的“数据”属性中提供)和当前用户的唯一组合标识。这三种方法的结合将要删除的对象缩小为单个对象(这是通过视图中的“get_object”方法完成的)。哦,ajax调用中的额外括号是复制/粘贴错误,因为ajax调用在我的代码中的函数内,我无意中包含了javascript函数的右括号(为了使它更简单,我没有将其包含在代码片段中)。不过观察得很好:)谢谢。你还有其他建议吗?请注意,如果我简单地将类型更改为
post
,而不是
delete
,代码工作正常,因此逻辑似乎是正确的。
path('post_details/delete/', PostDetailDeleteApiView.as_view(), name='post_details_delete'),
class PostDetailDeleteApiView(generics.DestroyAPIView):
    serializer_class = PostDetailSerializer

    # the code below allows it to work if uncommented and type in ajax changed to 'post'
    # def post(self, request, *args, **kwargs):
    #   return self.delete(request, *args, **kwargs)

    def get_object(self):
        """
        Returns the post detail object to be deleted based on the name:value pair
        provided by the ajax call.
        """
        data = self.request.data
        obj = Post_Detail.objects.filter(
            name=data.get('name', ''), value=data.get('value', '')
        ).filter(
            post__account__user=self.request.user
        )
        if obj.exists():
            return obj.get()
        else:
            raise Http404
class PostDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post_Detail
        fields = ['name', 'value']