我有一个由Django Admin管理的模型。如何根据当前登录的用户自定义其编辑表单的显示?例如,如果超级用户以外的人正在修改模型,我想隐藏某些字段。django:如何根据用户自定义ModelAdmin表单的显示?
这将会是巨大的,如果我能基于request.user
我有一个由Django Admin管理的模型。如何根据当前登录的用户自定义其编辑表单的显示?例如,如果超级用户以外的人正在修改模型,我想隐藏某些字段。django:如何根据用户自定义ModelAdmin表单的显示?
这将会是巨大的,如果我能基于request.user
设置fields
一个的hackish办法做到这一点是覆盖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)
但设置每次都变为期望的值,因为同样的管理实例也可能被其他用户的请求调用!
改变编辑窗体的一个有趣的方法是只改变只读字段列表。
为此只覆盖功能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
我觉得这个答案不太hackish的方式描述:https://stackoverflow.com/a/16115125/710394
def get_list_display(self, request):
...whatever logic you need here...
做出对不起我的问题是错误的,我真正的意思'fields'而不是'list_display',但你的建议仍然适用 – zer0stimulus 2010-09-05 19:07:57