字段级权限Django

时间:2013-12-05 11:06:58

标签: django django-permissions

今天我想出了一个要求,我需要实现字段级权限,以便寻找最佳方式。

class ABC(models.Model):
    field1 = .....
    field2 = .....
    field3 = .....

创建两个组(A和B)并分配两个人都可以添加/编辑/删除的权限 而另一个只能添加/编辑。但现在需要一些帮助: -

我想如果第一个组用户登录管理员他应该能够看到所有三个字段但是如果第二个组用户登录他们应该只看到field1。

我想在django admin中这个,因为我需要在这些之后执行一些操作。我的django版本是1.3

提前致谢

3 个答案:

答案 0 :(得分:3)

admin.py

class ABCAdmin(admin.ModelAdmin):
    fields = [.....]  # here comes the fields open to all users

    def change_view(self, request, object_id, extra_context=None):  # override default admin change behaviour
        if request.user in gruop2:  # an example 
            self.fields.append('field2')  # add field 2 to your `fields` 
            self.fields.append('field3')  # add field 3 to your `fields`

您可以使用the docs查看可用内容。以上是我用过的一个例子。您可能还需要定义change_viewadd_view

答案 1 :(得分:1)

以防万一其他人迷迷糊糊,给定的答案给我带来了一些问题。每次刷新视图时,都会一遍又一遍地追加字段。以及所需的受限视图(不应出现在该视图中)。

因此,根据docs,我使其工作如下:

创建自定义ModelForm

class AbcStaffForm(ModelForm):
    class Meta:
        model = Abc
        exclude = ["manager", "foo", "bar",]

在AbcModelAdmin中覆盖get_form()并引用自定义ModelForm

class AbcAdmin(admin.ModelAdmin):
    # some other code
    # ...
    def get_form(self, request, obj=None, **kwargs):
        if not request.user.is_superuser:
            kwargs['form'] = AbcStaffForm  # ModelForm

        return super().get_form(request, obj, **kwargs)

答案 2 :(得分:0)

您还可以在readonly_fields中覆盖changeform_view

在admin.py中尝试

class ABCAdmin(admin.ModelAdmin):

    def changeform_view(self, request, *args, **kwargs)
        self.readonly_fields = list(self.readonly_fields)
        if request.user in group:  #or another condition
            self.readonly_fields.append('field2')

        return super(ABCAdmin, self).changeform_view(request, *args, **kwargs)