Python 字段级权限Django

Python 字段级权限Django,python,django,django-permissions,Python,Django,Django Permissions,今天,我提出了一个要求,我需要实现现场级许可,以便寻找最好的方法 class ABC(models.Model): field1 = ..... field2 = ..... field3 = ..... 创建两个组(A和B)并分配两个组都可以添加/编辑/删除的权限 另一个只能添加/编辑。但现在需要一些帮助:- 我想,如果第一组用户登录管理,他应该能够看到所有三个字段,但如果第二组用户登录,他们应该只看到字段1 我想在django管理中使用它,因为我需要在这些操作之后执

今天,我提出了一个要求,我需要实现现场级许可,以便寻找最好的方法

class ABC(models.Model):
    field1 = .....
    field2 = .....
    field3 = .....
创建两个组(A和B)并分配两个组都可以添加/编辑/删除的权限 另一个只能添加/编辑。但现在需要一些帮助:-

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

我想在django管理中使用它,因为我需要在这些操作之后执行一些操作。我的django版本是1.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`

您可以使用查看可用的内容。上面是我的一个用法的例子。您可能还需要定义
更改视图
添加视图

您还可以覆盖
更改表单视图
中的
只读字段

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

为了防止其他人在这个问题上绊倒,我对给出的公认答案有一些疑问。每次刷新视图时,它都会一次又一次地追加字段。以及所需的受限视图,它不应该出现在该视图中

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

创建自定义模型表单 覆盖AbcModelAdmin中的get_form()&引用自定义模型表单
你想在django管理员中使用这个,还是你有自己的?要求不是很清楚,我想在django管理这一点。Django 1.3如果是那样的话,阿福,你将面临严重的黑客攻击。这不是Django管理员可以直接处理的。def get_form(self,request,obj=None,**kwargs):if request.user.groups.filter(name=“Group 1”):self.exclude=(“is_approved”,)form=super(SupplierAdmin,self)。get_form(request,obj,**kwargs)返回表单仍然显示该字段!
class AbcStaffForm(ModelForm):
    class Meta:
        model = Abc
        exclude = ["manager", "foo", "bar",]
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)