Django如何定义权限,以便用户只能编辑某些模型层次结构?

时间:2016-09-09 05:31:48

标签: python django permissions user-permissions

如果我有这样的模特..

class Family(Model):
    name = models.CharField()

class Father(Model):
    family = ForeignKey(Family)

class Mother(Model):
    family = ForeignKey(Family)

class Child(Model):
    family = ForeignKey(Family)

Django自动创建组权限,因此我可以定义可以编辑/创建/等的组...家庭模型。

如何限制它只允许用户编辑家庭模型的某个实例?因此,如果我希望'Johnson'家族管理员只有在'Johnson'家谱下编辑内容的权限。

我可以想到两种方法,一种是定义自定义权限,如(https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions),但我不知道文档在那里说什么,而且他们没有很好地解释它。

我还可以想到可能在用户模型上添加一个字段并检查其值,但是这样做是错误的...

2 个答案:

答案 0 :(得分:1)

我可以想象两种方法来实现你想要的东西,但那是实验性的,我不知道它是否会遵循良好的做法:

1 - Programmatically created permissions

代号部分基于实例。 例如,使用包含用户可以编辑的实例的代号创建权限:

docker network create net
docker run -d --net=web -v /var/www/:/usr/share/nginx/html nginx:1.9
docker run -d -p 80:80 --net=web haproxy

然后:

perm = Permission.objects.create(codename='can_create_'+str(obj.id),
                                 name='can edit instance with id ' + str(obj.id))
user.user_permissions.add(perm)

2 - ManyToMany relationships as permissions

可能是你自己的实地想法:

if user.has_perm('can_create_' + str(relevant_id)):

然后只需添加和删除用户可在其class myModel(models.Model): editors = models.ManyToManyField(User, related_name='mymodel_can_edit') 字段中删除的实例,就像管理其mymodel_can_edit字段中的权限一样。

但我没有测试任何这些解决方案。 如果你尝试一下,你可以告诉你对它的看法吗? :)

答案 1 :(得分:0)

您可以使用提供此功能的django模块。 我个人使用django-guardian,它使用类似于原始has_perm方法的界面提供每个对象的权限。