我希望在一个restful项目(使用django-rest-framework)中使用django-guardian来管理我的对象权限。
我想要的内容如下:
- 仅允许已登录用户在拥有“add_modelname”权限时创建对象 - 当已登录用户创建对象时,设置“delete_modelname”和“change_modelname”权限。 - 仅允许已登录用户在拥有“change_modelobject”权限时编辑对象。 - 仅允许已登录用户在拥有“delete_modelobject”权限时删除对象。
我正在尝试使用以下代码来处理这些情况:
view.py
我遇到的第一个问题是这行代码出现了错误:
我想要的内容如下:
- 仅允许已登录用户在拥有“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)
permissions.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')
始终返回 true。但我从未将此权限设置给我的用户(只尝试过管理员用户,可能是这个原因)。