【问题标题】:How to restrict so that the author of the post can only see and edit his posts如何限制帖子的作者只能看到和编辑他的帖子
【发布时间】:2023-01-19 22:52:41
【问题描述】:

在此代码中,只有帖子的作者可以编辑他的帖子,但是如何让帖子的作者只能看到他的帖子?

from rest_framework import permissions


class IsAuthorOrReadOnly(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user.is_authenticated:
            return True
        return False

    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.author == request.user

请添加指向有用阅读材料的链接

我的意见.py:

class TaskList(generics.ListCreateAPIView):
# permission_classes = (IsAuthorOrReadOnly,)
queryset = Task.objects.all()
serializer_class = TaskSerializer

class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
# permission_classes = (IsAuthorOrReadOnly,)
queryset = Task.objects.all()
serializer_class = TaskSerializer

【问题讨论】:

    标签: python-3.x django django-rest-framework django-views django-rest-framework-permissions


    【解决方案1】:

    如果您希望作者看到他的帖子,您可以简单地限制所有用户访问该对象。像这样:

    from rest_framework import permissions
    
    
    class IsAuthorOrReadOnly(permissions.BasePermission):
        def has_permission(self, request, view):
            if request.user.is_authenticated:
                return True
            return False
    
        def has_object_permission(self, request, view, obj):
            return obj.author == request.user
    

    现在,无论任何类型的请求方法,都只有作者可以访问该对象。

    但是如果你有一个列表视图并且你不希望作者看到其他帖子,你可以这样尝试:

    class TaskList(generics.ListCreateAPIView):
        queryset = Task.objects.all()
        serializer_class = TaskSerializer
    
        def get_queryset(self):
            return super().get_queryset(author=self.request.user)
    
    class TaskDetail(generics.RetrieveUpdateDestroyAPIView):
        queryset = Task.objects.all()
        serializer_class = TaskSerializer
    
        def get_queryset(self):
            return super().get_queryset(author=self.request.user)
    

    或者将它们组合成viewset

    class TaskViewSet(viewsets.ModelViewSet):
        """
        A simple ViewSet for viewing and editing tasks.
        """
        permission_classes = [IsAuthenticated,]
        queryset = Task.objects.all()
        serializer_class = TaskSerializer
    
        def get_queryset(self):
            return super().get_queryset(author=self.request.user)
    

    更多信息可以在documentation找到

    【讨论】:

    • 你会把 SomeListView 重写成 API 视图吗?
    • 这段代码是一个例子,我只能根据你自己的实现来重写。如果您可以分享您的视图代码,那么我也许可以提供帮助。
    • 请查看更新后的答案
    • 更新了问题
    • 非常感谢你
    猜你喜欢
    • 2019-10-18
    • 2014-11-06
    • 2015-05-28
    • 2015-05-09
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多