我有一个由Django Admin管理的模型。如何根据当前登录的用户自定义其编辑表单的显示?例如,如果超级用户以外的其他人正在修改模型,我想隐藏某些字段。
如果我可以根据fields
request.user
,那就太棒了
答案 0 :(得分:2)
执行此操作的一种hackish方法是在调用changelist视图时覆盖list_display
变量:
class MyModelAdmin(admin.ModelAdmin)
def changelist_view(self, request, extra_context=None):
user = request.user
if user.is_superuser:
self.list_display = ['field1', 'field2']
else:
self.list_display = ['field1']
return super(MyModelAdmin, self).changelist_view(request, extra_context=None)
但每次都要将变量设置为所需的值,因为也可能会为其他用户的请求调用相同的管理实例!
答案 1 :(得分:1)
更改编辑表单的一个有趣方法是仅更改只读字段列表。
为此目的,只覆盖函数 get_readonly_fields :
class MyModelAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
user = request.user
if user.is_superuser:
readonly = []
else:
readonly = ['field1']
return readonly
关于 list_display 现代修改方法是重新定义 get_list_display :
原始定义只返回self.list_display
:
class ModelAdmin:
def get_list_display(self, request):
"""
Return a sequence containing the fields to be displayed on the
changelist.
"""
return self.list_display
所以你可以提供:
class MyModelAdmin(admin.ModelAdmin):
def get_list_display(self, request):
user = request.user
if user.is_superuser:
list_display = ['field1', 'field2']
else:
list_display = ['field1']
return list_display
答案 2 :(得分:0)
我认为这个答案中描述了一种不那么强硬的方式:https://stackoverflow.com/a/16115125/710394
def get_list_display(self, request):
...whatever logic you need here...