Django 权限

7
我希望在我的Django项目中拥有更细粒度的权限,但是我无法决定使用哪个应用程序。 我现在有这样一个需求:
class Item(models.Model):
    name = models.CharField(max_length=64, unique=True)
    description = models.CharField(max_length=128, default='')
    logo = ImageField(upload_to=/tmp, blank=True, null=True)

现在,使用Django标准权限,我可以选择添加、修改和删除,但我想要扩展修改权限,以提供仅允许更改徽标的组权限,但禁止该组修改项目描述。我不需要用户输入关系,只需通过标准管理界面为不同的组提供编辑模型单个字段的可能性。我甚至不确定我是否在谈论每个对象的权限?有人知道最好使用什么或如何自己实现它吗?我还可以想象具有只读权限的用户,他们可以访问/阅读所有内容,但无法进行修改,这也是不可能的。感谢任何帮助。

不,这些不是对象级别的权限。简短回答:可能可行,但需要大量代码。长回答:在原始的Django管理界面中无法实现您所描述的功能。一种方法是将具有相关字段启用的单独的ModelAdmin连接到单独的AdminSite实例上。我认为您可能需要子类化AdminSite以使其针对您的组进行检查,并硬编码每个组拥有的权限 - Django内置的权限没有允许/禁止字段的概念。 - AdamKG
非常感谢您提供的预期答案和确认。我将期待着实现单独的AdminSite子类来完成我的任务。 - rthill
3个回答

7

谢谢,你也可以按照AdamKG所描述的方式来实现。这种方式要简单得多,因为你不需要自定义视图和相应的模板。 - rthill

1
一个简单的实现方法是为同一模型创建多个ModelAdmin(每个“组”一个)。为此,您需要创建每个“组”一个代理模型,如下所示:

models.py

class Item(models.Model):
    name = models.CharField(max_length=64, unique=True)
    description = models.CharField(max_length=128, default='')
    logo = ImageField(upload_to=/tmp, blank=True, null=True)

class ItemGroup1(Item):
    class Meta:
        proxy = True

admin.py

class ItemAdmin(models.ModelAdmin):
    ...

class ItemGroup1Admin(models.ModelAdmin):
    readonly_fields = ('logo', 'description')

然后你只需要将第一组的权限设置为仅能访问ItemGroup1等。

更多信息请参见此帖子:使用代理模型自定义Django管理界面


0
如果您想在管理站点之外处理此类事情,请查看django-logical-rules,在那里您可以使用Python编写规则并从视图或模板中访问它们;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接