15

今天我提出了一个要求,我需要实现字段级别的权限,以便寻找最好的方法。

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

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

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

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

提前致谢

4

3 回答 3

5

在你的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`

您可以使用文档来查看可用的内容。以上是我的一个用法示例。您可能还需要定义change_viewand add_view

于 2013-12-05T12:02:46.620 回答
2

以防其他人偶然发现这一点,我对给定的接受答案有一些问题。每次刷新视图时,它都会一遍又一遍地附加字段。以及不应该出现的所需受限视图。

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

创建自定义 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)
于 2019-08-01T16:01:54.147 回答
1

您也可以readonly_fieldschangeform_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)
于 2019-06-26T13:02:36.800 回答