Django 如何定义权限以便用户只能编辑某些模型层次结构?
Django how to define permissions so users can only edit certain model hierarchies?
如果我有这样的模型..
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 自动设置组权限,因此我可以定义可以 edit/create/etc... 家庭模型的组。
如何限制它只允许用户编辑家庭模型的某个实例?因此,如果我希望 'Johnson' 家庭管理员仅有权编辑 'Johnson' 家谱下的内容。
我可以想到两种方法,一种是定义自定义权限,例如 (https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions),但我不知道文档在那里说了什么,而且他们没有很好地解释它。
我也可以考虑在用户模型上添加一个字段并检查它的值,但这样做感觉不对...
我可以想象有两种方法可以实现你想要的,但那是实验性的,我不知道它是否会遵循良好的做法:
1 - Programmatically created permissions :
代号部分基于实例。
例如,使用包含用户可以编辑的实例的代号创建权限:
perm = Permission.objects.create(codename='can_create_'+str(obj.id),
name='can edit instance with id ' + str(obj.id))
user.user_permissions.add(perm)
然后:
if user.has_perm('can_create_' + str(relevant_id)):
2 - ManyToMany relationships as permissions :
可能是您自己的实地想法:
class myModel(models.Model):
editors = models.ManyToManyField(User, related_name='mymodel_can_edit')
然后只需添加和删除用户可以在其 mymodel_can_edit
字段中删除的实例,就像您在其 user_permissions
字段中管理权限一样。
但我没有测试任何这些解决方案。
如果你尝试一下,你能说说你的想法吗? :)
您可以使用提供此功能的 django 模块。
我个人使用 django-guardian,它使用类似于原始 has_perm
方法的界面提供每个对象的权限。
如果我有这样的模型..
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 自动设置组权限,因此我可以定义可以 edit/create/etc... 家庭模型的组。
如何限制它只允许用户编辑家庭模型的某个实例?因此,如果我希望 'Johnson' 家庭管理员仅有权编辑 'Johnson' 家谱下的内容。
我可以想到两种方法,一种是定义自定义权限,例如 (https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions),但我不知道文档在那里说了什么,而且他们没有很好地解释它。
我也可以考虑在用户模型上添加一个字段并检查它的值,但这样做感觉不对...
我可以想象有两种方法可以实现你想要的,但那是实验性的,我不知道它是否会遵循良好的做法:
1 - Programmatically created permissions :
代号部分基于实例。 例如,使用包含用户可以编辑的实例的代号创建权限:
perm = Permission.objects.create(codename='can_create_'+str(obj.id),
name='can edit instance with id ' + str(obj.id))
user.user_permissions.add(perm)
然后:
if user.has_perm('can_create_' + str(relevant_id)):
2 - ManyToMany relationships as permissions :
可能是您自己的实地想法:
class myModel(models.Model):
editors = models.ManyToManyField(User, related_name='mymodel_can_edit')
然后只需添加和删除用户可以在其 mymodel_can_edit
字段中删除的实例,就像您在其 user_permissions
字段中管理权限一样。
但我没有测试任何这些解决方案。 如果你尝试一下,你能说说你的想法吗? :)
您可以使用提供此功能的 django 模块。
我个人使用 django-guardian,它使用类似于原始 has_perm
方法的界面提供每个对象的权限。