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)