组权限连接到模型列表



我的模型:

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
POSITIONS = (
("volunteer", "volunteer"),
("employee", "employee"),
("manager", "manager"),
("director", "director"),
("vet", "vet")
)
position = models.CharField(choices=POSITIONS, max_length=15)
picture = models.ImageField(blank=True, null=True)

我正在使用基于类的视图。我想根据"位置"值授予访问不同视图的权限。我已经找到了十几种解决方案,现在我有点困惑。制作我想做的事情的最佳方式是什么?

我会使用自定义装饰器。您可以使用@method_decorator(decorator, name='dispatch').首先,您将在应用程序目录中创建一个 decorators.py 文件。几乎发生的情况是在视图之前调用方法装饰器并将函数传递给第一个可调用对象。我们实际做的是使可调用的可调用作为位置检查并传递位置参数。然后我们处理实际的方法装饰器部分,该部分在_method_wrapper中传递函数参数。此时,我们执行计算就像在视图中使用可调用_wrapper变量一样。

# decorators.py
from django.core.exceptions import PermissionDenied
from app.models import UserProfile
def position_check(position):
def _method_wrapper(function):
def _wrapper(request, *args, **kwargs):
try:
user = UserProfile.object.get(user_id=request.user.id)
except UserProfile.DoesNotExist:
raise PermissionDenied
if user.position == position:
return function(request, *args, **kwargs)
else:
raise PermissionDenied
return _wrapper
return _method_wrapper

现在在你看来,你会这样称呼它。

# views.py
from app.decorators import position_check
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
@method_decorator(position_check('manager'), name='dispatch')
class HomeView(TemplateView):
template_name = "home.html"

我能看到您遇到的唯一问题是需要继承权限。我不会按照你拥有的方式设置你的选择。我会将实际值设置为一个数字,将选择部分设置为您的人类可读性,如下所示。这将允许您根据数字值设置权限if user.position >= 3以便控制器随后从经理继承权限。

POSITIONS = (
(1, "volunteer"),
(2, "employee"),
(3, "manager"),
(4, "director"),
(5, "vet")
)

最新更新