今天我想出了一个要求,我需要实现字段级权限,以便寻找最佳方式。
class ABC(models.Model):
field1 = .....
field2 = .....
field3 = .....
创建两个组(A和B)并分配两个人都可以添加/编辑/删除的权限 而另一个只能添加/编辑。但现在需要一些帮助: -
我想如果第一个组用户登录管理员他应该能够看到所有三个字段但是如果第二个组用户登录他们应该只看到field1。
我想在django admin中这个,因为我需要在这些之后执行一些操作。我的django版本是1.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_view
和add_view
。
答案 1 :(得分:1)
以防万一其他人迷迷糊糊,给定的答案给我带来了一些问题。每次刷新视图时,都会一遍又一遍地追加字段。以及所需的受限视图(不应出现在该视图中)。
因此,根据docs,我使其工作如下:
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)
答案 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)