如何根据基于django的角色添加删除视图

问题描述

嗨,我正在研究树结构角色。 有4个角色 1.A 2.B 3.C 4.D

哪里

  1. A 可以添加删除视图 B、C、D,而 B、C、D 不能删除或查看 A。
  2. B 可以添加删除视图 C、D,但不能删除 A 及其父视图。

C 和 D 类似。 我可以在 Django 中创建不同的视图和使用权限。 但我想使用一个视图来实现这一点。我将通过 url 添加角色 假设通过 url 而不是选择。

请帮我解决这个问题。

提前致谢。

解决方法

来自Django docs

不仅可以按对象类型设置权限,还可以按对象设置权限 特定对象实例。通过使用 has_view_permission(), has_add_permission(),has_change_permission() 和 ModelAdmin 类提供的 has_delete_permission() 方法,它 可以为不同的对象实例自定义权限 同类型。

因此,如果您使用的是 django 管理界面,则可以覆盖 ModelAdmin 中的 has_*_permission 方法。

对于您的自定义视图,您可以使用 @user_passes_test 装饰器。我想这应该适用于您的情况。

,

您可以使用 Imagine smart compiler 创建自定义 RolesPermissions。 类似以下的内容应该可以工作:

Permission A
Permission B
Permission C
Permission D


API /api1 {
   actions [Create,Read,ReadMany,Delete]
   permissions [A]
}
....

编译:

imagine compile myapp.im

这将产生: permissions.py

from rest_framework import permissions


class A(permissions.BasePermission):
    def has_permission(self,request,view):
        return request.user and request.user.has_perm('app.A')


class B(permissions.BasePermission):
    def has_permission(self,view):
        return request.user and request.user.has_perm('app.B')


class C(permissions.BasePermission):
    def has_permission(self,view):
        return request.user and request.user.has_perm('app.C')


class D(permissions.BasePermission):
    def has_permission(self,view):
        return request.user and request.user.has_perm('app.D')

views.py


from .models import Product
from .permissions import A
from .serializers import ProductSerializer


class Api1ViewSet(viewsets.GenericViewSet,mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.ListModelMixin,mixins.DestroyModelMixin):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [A]
    filterset_fields = ['id','name','price','description']