【问题标题】:Django app for user/account settings用于用户/帐户设置的 Django 应用程序
【发布时间】:2023-03-28 05:14:01
【问题描述】:

我正在为开发一个项目做准备,并且正在规划出我可以使用的东西。该项目将需要不同的基于组/用户的模型和对象权限和设置。

我知道我可以使用 django-objectpermissions (https://github.com/washingtontimes/django-objectpermissions) 和 djangos 自己的模型权限。但是在某些情况下,当您真的不需要设置对象/模型权限,而是设置 - 此帐户/用户可以做一些与某些对象或模型无关的事情时。有人为此开发了应用程序吗?或者当人们有这样的需求时,他们会采取什么样的方法?也许创建虚拟 django 模型并让 djangos 模型权限处理其余部分?

我也知道,这有类似的作用 - https://github.com/danielroseman/django-dbsettings。但是当我浏览代码时,我得到的印象是,这些设置都是基于用户的——我还需要基于组的设置。

编辑:人们不断向我提供权限应用。我要找的不是权限应用程序,而是设置应用程序。这些设置/权限与任何对象无关。

基本上。在我的项目中,我需要回答问题——这个用户可以看到/做这件事吗?那个“东西”很可能是一个视图。所以其中一个答案几乎有效。但是我在查看时所做的检查不是用户是否有权访问某些模型/对象。相反,如果用户打开了此设置,或者用户组是否打开了此设置。

艾伦

【问题讨论】:

标签: django settings django-permissions


【解决方案1】:

您可能需要为此创建自己的系统。应该不是很难。

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

您可以轻松构建一个装饰器来进行检查,并为视图提供一个值列表(或单个项目)。

【讨论】:

    【解决方案2】:

    也许这就是你要找的东西:django-guardian

    【讨论】:

    【解决方案3】:

    对于“动作”(动作通常由视图实现)的权限,我通常使用装饰器。

    user_passes_test 装饰器非常适合这种用途。

    您可以创建未链接到模型的用户权限。

    【讨论】:

    • 谢谢。这是很好的提示。但我不仅需要权限——我需要一些设置,它们不能完全基于用户——但必须基于组/帐户。喜欢 - 此帐户或组是否打开了这个或那个。我应该为此或那个创建虚拟模型,然后使用权限处理它吗?或者有没有应用程序?
    • 我会按照乔希的建议自己做
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2013-02-05
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多