【问题标题】:Django-guardian - where to assign default permission on object creationDjango-guardian - 在哪里分配对象创建的默认权限
【发布时间】:2012-10-26 03:54:30
【问题描述】:

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

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()

这个方法的问题是我必须给用户对象的保存访问权限,这意味着还要覆盖 init 来设置 self.request = request。

post_save 信号

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

希望这能提供足够的洞察力,让我了解我的情况。

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

谢谢,

京东

【问题讨论】:

    标签: django django-permissions


    【解决方案1】:

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

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

    很遗憾,您的答案没有最佳方法。另外,请记住,如果您使用原始 SQL 插入实例或执行 bulk_create (https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create),则不会触发 save 方法和 post_save 信号。因此,请确定您希望发生这种自动权限分配的位置(无论如何应该是一个位置)。

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

    希望有帮助!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2012-06-11
      • 2018-02-14
      • 1970-01-01
      • 2020-06-25
      相关资源
      最近更新 更多