我想在一个安静的项目中使用 django-guardian 管理我的对象权限(使用 django-rest-framework)。
我想要什么:
“add_modelname”权限。
和“change_modelname”权限。
“change_modelobject”权限。
“删除模型对象”权限。
我正在尝试使用以下代码管理这些案例:
查看.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')
总是返回真。但是我从来没有为我的用户设置过这个权限(只用管理员用户试过,也许这就是原因)。
最佳答案
create
View 集的方法将返回一个新创建的模型实例。您正在尝试将权限分配给 View 集对象本身。您的代码 create
方法应如下:
def create(self, request, *args, **kwargs):
instance = super().create(request, *args, **kwargs)
assign_perm("change_modelname", request.user, instance)
assign_perm("delete_modelname", request.user, instance)
return instance
这将创建模型实例,然后在返回之前为其分配所需的权限。
关于permissions - django-guardian 和 django-rest-framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39354636/