在我看来,您实际上是在寻找权限组。它们可以很容易地独立创建模型。用户组不需要包含任何实际权限。
您可以检查用户是否在特定组中:
def user_in_group(user, group_name):
return user.groups.filter(name=group_name).count()
你可以像这样使用它:
def my_view(request):
if user_in_group(request.user, 'view_all'):
# do the things
else:
# do the other things
# limit this view to 'view_all' users
@user_passes_test(lambda u: user_in_group(u, 'view_all'))
def my_other_view(request):
# and do some more things
我不知道你是什么意思
您是在信号级别还是在使用模型的每个点都实现了这一点?
显然,对于任何授权方法,您都需要在查看模型的任何地方插入检查并插入逻辑以仅显示允许的列(例如在模板中呈现列的子集)。
为了确保不会访问错误的列,您可以编写限制对适当字段/列的访问的代理类,并使用代理实例而不是模型实例。
class SomeModelProxy(object):
def __init__(self, model_instance, user):
self.instance = model_instance
self.user = user
def save(self, *args, **kwargs):
self.instance.save(*args, **kwargs)
# define other methods that are needed...
def __getattr__(self, name):
if not name in get_allowed_columns_for_user_somehow(self.user):
raise AttributeError
return getattr(self.instance, name)
def __setattr__(self, name, value):
if not name in get_allowed_columns_for_user_somehow(self.user):
raise AttributeError
setattr(self.instance, name, value)