Django-guardian - 在哪里为对象创建分配默认权限

时间:2012-10-26 03:54:30

标签: django django-permissions

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

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)

一般来说,我更喜欢从我的观点中获取这些类型的事件。

覆盖保存()

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

post_save信号

我知道我可以利用这个信号,但与之前的两个相比,我还没有尝试过这个。

希望这能充分展示我对事物的处理方式。

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

谢谢,

JD

1 个答案:

答案 0 :(得分:3)

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

AD post_save信号:如果你没试过......试试吧!关于信号主题的文档非常好,它们很容易学习。可能棘手的是你应该在哪里连接信号(我更喜欢在模型模块的末尾那样做)。

不幸的是,没有最好的方法来回答你。此外,请记住,如果您使用原始SQL插入实例或执行save(https://docs.djangoproject.com/en/1.4),则不会触发post_save方法和bulk_create信号。 / REF /模型/查询集/#批量创建)。因此,要确定您希望进行此自动权限分配的地方(无论如何,这应该是一个地方)。

或者,您可以将指向创建者的FK字段添加到模型中。您将能够使用该信息而不是使用监护人检查权限(并且您注意到使用的mixin也应该很适合您的问题)。我不久前在项目管理应用程序中使用了这种方法。

希望有所帮助!

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