【问题标题】:Django permissionsDjango 权限
【发布时间】:2012-02-18 16:50:59
【问题描述】:

我希望在我的 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 管理员中描述的事情。一种方法是将单独的 ModelAdmins 与启用的相关字段连接起来以分离 AdminSite 实例。我认为您可能必须将 AdminSite 子类化以使其检查您的组,并对每个组具有的权限进行硬编码 - django 的内置权限没有允许/不允许字段的概念。
  • 非常感谢您的预期答复和确认。我期待实现单独的 AdminSite 子类来完成我的任务。

标签: django django-models django-admin django-permissions


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    最灵活的方法是:

    1. 写一些custom permissions(即can_modify_descr
    2. 写你自己的FormsModelForms
    3. 编写视图以呈现您指定的表单。
    4. 最后你必须override some django admin templates 并在extend some standard django admin templates 的模板中呈现你的表单。

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

    【讨论】:

    • 谢谢,您也可以按照 AdamKG 描述的方式进行操作。这种方式更容易,因为您没有自定义视图和相应的模板。
    【解决方案3】:

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

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

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

    查看这篇文章了解更多信息:Using Proxy Models to Customize the Django Admin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2022-01-04
      • 2020-01-25
      • 2023-04-05
      相关资源
      最近更新 更多