首页 > 解决方案 > “详细信息”:“方法\删除\不允许”django

问题描述

我制作了一个视图,可以使用模型视图集使用 put、delete 请求并将其映射到 url。我已经明确可以向 url 请求放置和删除请求,但是如果您向 url 发送删除请求,我会返回 405 错误。我的代码有什么问题?这是我的代码。

视图.py

class UpdateDeletePostView (ModelViewSet) :
    serializer_class = PostSerializer
    permission_classes = [IsAuthenticated, IsOwner]
    queryset = Post.objects.all()

    def update (self, request, *args, **kwargs) :
        super().update(request, *args, **kwargs)
        return Response({'success': '게시물이 수정 되었습니다.'}, status=200)

    def destroy (self, request, *args, **kwargs) :
        super().destroy(request, *args, **kwargs)
        return Response({'success': '게시물이 삭제 되었습니다.'}, status=200)

提要\urls.py

path('post/<int:pk>', UpdateDeletePostView.as_view({'put': 'update', 'delete': 'destroy'})),

服务器\urls.py

path('feed/', include('feed.urls')),

和错误

"detail": "method \delete\ not allowed"

标签: pythondjangodjango-rest-framework

解决方案


正如我在评论中所写的那样,您似乎不需要 aViewSet因为您只处理单个项目的操作。一般来说,您可以使用适当的 mixin 来限制 View 或 ViewSet 可用的操作。

我建议两种可能的方法

使用通用视图

class UpdateDeletePostView(
        UpdateModelMixin,
        DeleteModelMixin,
        GenericAPIView):
    .....

urlpatterns = [
    path('post/<int:pk>', UpdateDeletePostView.as_view()),
    ...
]

使用 ViewSet 和路由器

class UpdateDeletePostViewSet(
        UpdateModelMixin,
        DeleteModelMixin,
        GenericViewset):
    .....
router = SimpleRouter()
router.register('feed', UpdateDeletePostViewSet)

urlpatterns = [
    path('', include(router.urls)),
    ...
]

推荐阅读