Вам, вероятно, понадобится создать собственную систему для этого. Это не должно быть очень сложно.
class Setting(models.Model):
name = models.CharField(..)
value = models.CharField(..)
users = models.ManyToManyField(User)
groups = models.ManyToManyField(Group)
@classmethod
def has_setting(cls, name, user):
user_settings = cls.objects.filter(name=name, users__in=[user]).count()
group_settings = cls.objects.filter(name=name, groups__in=user.groups.all()).count()
return user_settings or group_settings
@classmethod
def get_settings(cls, name, user, priority=User):
user_settings = list(cls.objects.filter(name=name, users__in=[user]))
group_settings = list(cls.objects.filter(name=name, groups__in=user.groups.all()))
if user_settings and not group_settings:
return user_settings
elif group_settings and not user_settings:
return group_settings
else:
return (group_settings, user_settings)[priority==User]
Тогда вы можете сделать что-то подобное в своих представлениях:
def display_frob(request):
if Setting.has_setting('display_frob', request.user):
settings = Setting.get_setting('display_from', request.user, priority=Group)
values = [setting.value for setting in settings]
# if the User was in many groups, we now have a list of values, for the setting
# `display_frob`, that aligns with each of those groups
Вы можете легко создать декоратор, который будет выполнять проверку и предоставлять список (или один элемент) значений для представления.