сделать просмотр доступным только конкретным пользователям (то есть, кто создал эту модель) в остальных django - PullRequest
0 голосов
/ 10 июня 2018

У меня есть одна модель, у которой в качестве атрибута ForeignKey указан пользователь, то есть автозаполнение, т.е.залогиненный пользователь там заполнен.Я сделал токен аутентификации.Только Аутентифицированные // я имею в виду, что авторизованные пользователи могут посетить это представление.Но я планирую сделать так, чтобы только пользователь, который создал этот объект модели, мог только обновлять содержимое этого объекта. Например:

class Something(models.Model):
    sth_name = models.CharField(max_length=18)
    sth_qty = models.IntegerField()
    user = models.ForeignKey(User)

в моем представлении: я переопределяю execute_create () для автоматического сопоставления с вышеуказанной моделью.

 def perform_create(self, serializer):
     return serializer.save(user=self.request.user)

Что мне конкретно нужно сделать?Я должен написать какой-то метод разрешений, но я действительно застрял.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Да, вам нужно создать разрешение на уровне объекта.Об этом подробно рассказывается в руководстве по DRF: http://www.django -rest-framework.org / tutorial / 4-authentication-and-permissions / # object-level-permissions

В частности, создайтефайл permissions.py в вашем приложении и добавьте туда это разрешение:

class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """

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

Затем в вашем классе представления, который имеет ресурс обновления для модели Something (вероятно, SomethingDetail), добавьте permission_classes поле:

class SomethingDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Something.objects.all()
    serializer_class = SomethingSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)
0 голосов
/ 10 июня 2018

Просто добавьте пользователя при извлечении объекта

obj = get_object_or_404(Something, pk=pk, user=request.user)

Обратите внимание, что это вызовет 404. Если вы хотите ошибку 403, используйте пользовательское условие для проверки пользователя и поднимите PermissionDenied.Если вы хотите сделать это для нескольких представлений, поместите логику условия в декоратор.

...