Я хотел бы управлять разрешением своих объектов с помощью django-guardian в спокойном проекте (используя django-rest-framework).
Что я хотел бы:
- Разрешить подключенному пользователю создавать объект, только если у него есть разрешение «add_modelname».
- Когда подключенный пользователь создает объект, установите разрешения «delete_modelname» и «change_modelname».
- Разрешить подключенному пользователю редактировать объект, только если у него есть разрешение «change_modelobject».
- Разрешить подключенному пользователю удалять объект, только если у него есть разрешение «delete_modelobject».
Я пытаюсь управлять этими случаями с помощью этого кода:
view.py
class ModelNameViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
Additionally we also provide an extra `highlight` action.
"""
queryset = ModelName.objects.all()
serializer_class = ModelNameSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, ModelNamePermission)
def create(self, request, *args, **kwargs):
assign_perm("change_modelname", request.user, self)
assign_perm("delete_modelname", request.user, self)
return super().create(request, *args, **kwargs)
разрешения.py
class ModelNamePermission(permissions.BasePermission):
"""
Custom permission to only allow owners of an object to edit it.
"""
def has_permission(self, request, view):
if request.method in ['GET']:
return request.user.has_perm('view_modelname')
if request.method in ['POST']:
return request.user.has_perm('add_modelname')
if request.method in ['PUT', 'PATCH']:
return request.user.has_perm('change_modelname')
if request.method in ['DELETE']:
return request.user.has_perm('delete_modelname')
return False
def has_object_permission(self, request, view, obj):
if request.method in ['GET']:
return request.user.has_perm('view_modelname', obj)
if request.method in ['POST']:
return request.user.has_perm('add_modelname', obj)
if request.method in ['PUT', 'PATCH']:
return request.user.has_perm('change_modelname', obj)
if request.method in ['DELETE']:
return request.user.has_perm('delete_modelname', obj)
return False
Первая проблема, с которой я сталкиваюсь, заключается в том, что у меня есть ошибка в этой строке:
assign_perm("change_modelname", request.user, self)
ошибка :
error: 'ModelNameViewSet' object has no attribute '_meta'
И я думаю, что остальная часть кода не будет работать, но, по крайней мере, вы можете видеть, что я хочу сделать.
Я не видел ни одного примера с этими специфическими случаями.
Изменить: Другое дело, что этот код:
request.user.has_perm('view_coachingrequest')
всегда возвращает истину. Но я никогда не устанавливал это разрешение для своего пользователя (может быть, поэтому пробовал только с правами администратора).