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 标准权限,我可以在添加、更改和删除之间进行选择,我想要的是扩展的更改权限,以提供仅授予组权限以更改徽标的能力,但不允许同一组修改项目描述。我不希望或不需要用户进入关系,而只是让不同组可以使用标准管理界面编辑模型的单个字段。我什至不确定我是否在谈论每个对象的权限?

有谁知道最好使用什么或我将如何自己实现它?我还可以想象拥有可以访问/读取所有内容但无法修改的只读用户,这也不可能。

谢谢你的帮助。

4

3 回答 3

7

最灵活但最灵活的方法是:

  1. 编写一些自定义权限(即can_modify_descr
  2. 编写自己的表单模型表单
  3. 编写视图以呈现您指定的表单。
  4. 最后,您必须覆盖一些 django 管理模板并在扩展一些标准 django 管理模板的模板中呈现您的表单。

据我所知,这是实现您想要的唯一方法,但也需要大量工作。

于 2012-01-25T14:13:12.807 回答
1

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

模型.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

管理员.py

class ItemAdmin(models.ModelAdmin):
    ...

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

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

有关更多信息,请参阅此帖子:使用代理模型自定义 Django Admin

于 2012-01-25T17:44:58.520 回答
0

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

于 2013-12-03T19:31:49.497 回答