Django-guardian-在其中创建对象的默认权限的地方

问题描述 投票:6回答:1

我正在启动一个具有复杂权限结构的应用程序,该结构将不可避免地由用户自己管理。我在模型中具有以下权限:

class Meta:
    permissions = (
    ('can_view', 'View project'),
    ('manage_view', 'Can assign View project'),
    ('can_edit', 'Edit project'),
    ('manage_edit', 'Can assign Edit project'),
    ('can_delete', 'Delete project'),
    ('manage_delete', 'Can assign Delete project'),
    ('creator', 'Full access to model features.'),
    )

这些将在Django-guardian的对象级别进行管理,而我正在使用自定义的mixins处理所有各种组合和功能。

'创建者'权限已分配给对象的初始创建者,他们可以通过基于电子邮件的邀请系统将其他权限分配给用户。

我的问题围绕着这些选项,这些选项用于分配创建者对对象的创建权限。

到目前为止我已经想到的一些方法:

保存后分配视图

newObject.save()
assign('creator', User, newObject)

[通常,我更喜欢从我的观点中排除这些类型的事件。

覆盖save()

此方法的问题是我必须授予对User对象的保存访问权限,这意味着也要覆盖init来设置self.request = request。

保存后的信号

我知道我可以利用这个信号,但是与前两个信号相比,我还没有尝试实现此信号。

希望这能提供我对事物处境的足够了解。

我很想知道这些方法中最好的是什么,或者,如果它们都是坏主意,那么什么是替代实现。

谢谢,

JD

django django-permissions
1个回答
4
投票

AD Override save():您可以将[[user参数添加到save方法中(因此也不必覆盖init)。如果您尝试在不传递user实例的情况下调用save方法,这种方式的代码将在运行时中断(并且只要测试您的代码,就可以使用该方法)。

AD post_save signal:如果您没有尝试,请尝试!有关信号主题的文档非常好,而且很容易学习。可能比较棘手的是您应该在哪里连接信号(我更愿意在models

模块的末尾进行连接)。不幸的是,没有最佳的答案。另外,请记住,如果您使用原始SQL插入实例或执行savepost_save),则不会触发bulk_create方法和https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create信号。因此,确定要进行自动权限分配的位置(无论如何都应该是一个位置)。

或者],您可以将指向creator的FK字段添加到模型中。您将能够使用该信息,而不用向监护人检查权限(并且正如您所提到的,使用实际上也很适合您的问题的混合)。不久前,我在项目管理应用程序中使用了这种方法。

希望有帮助!

https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create

© www.soinside.com 2019 - 2024. All rights reserved.