显示不同的模型管理员 list_display 和为不同用户组设置的字段
Show different model admin list_display and fields set for different user groups
在 django 中我有超级用户和内容编辑组。
当我以超级用户身份编辑模型时,我希望能够编辑所有字段。如果有人以编辑者身份登录,我希望他只能编辑特定字段。
我已经用 get_form
方法做到了:
class VideoAdmin(admin.ModelAdmin):
editor_fields = ('description','description_rewrited')
def get_form(self, request, obj=None, **kwargs):
if not hasattr(request.user, 'perms_list'):
request.user.perms_list = request.user.groups.values_list('name',flat=True)
if 'video_description_rewriter' in request.user.perms_list:
print('rewrite fields to normal')
self.fields = self.normaluser_fields
return super(VideoAdmin, self).get_form(request, obj, **kwargs)
对我有用。但是,当我以常规编辑器的身份打开视频进行编辑时,它会将超级用户字段集更改为编辑器字段集。
- 以超级用户身份打开管理模型 - http://joxi.ru/zAN5wWMIVjz429
- 以编辑器身份打开管理模型 - http://joxi.ru/p27LJPZiDNgeA7
- 现在超级用户设置了与编辑相同的字段 - http://joxi.ru/L21jko5TW0ydAX
我假设有某种模板缓存?
当用户是编辑者时,您将 self.fields
设置为 self.normaluser_fields
,但当用户是管理员时,您没有将 self.fields
设置回默认值。 ModelAdmin
对象在应用程序加载时创建,并在所有用户之间共享!
当管理员进入页面时将字段改回默认值并不能 100% 解决问题。当管理员和非管理员用户同时尝试进入编辑页面时,可能会出现竞争条件。他们都可以获得相同的字段。
与其重写get_form
,不如重写get_fields
方法更简单:
def get_fields(self, request):
if not hasattr(request.user, 'perms_list'):
request.user.perms_list = request.user.groups.values_list('name',flat=True)
if 'video_description_rewriter' in request.user.perms_list:
print('rewrite fields to normal')
return self.normaluser_fields
return self.fields
该方法不会覆盖 ModelAdmin
对象中的任何值,因此更改仅对一个用户可见。
在 django 中我有超级用户和内容编辑组。
当我以超级用户身份编辑模型时,我希望能够编辑所有字段。如果有人以编辑者身份登录,我希望他只能编辑特定字段。
我已经用 get_form
方法做到了:
class VideoAdmin(admin.ModelAdmin):
editor_fields = ('description','description_rewrited')
def get_form(self, request, obj=None, **kwargs):
if not hasattr(request.user, 'perms_list'):
request.user.perms_list = request.user.groups.values_list('name',flat=True)
if 'video_description_rewriter' in request.user.perms_list:
print('rewrite fields to normal')
self.fields = self.normaluser_fields
return super(VideoAdmin, self).get_form(request, obj, **kwargs)
对我有用。但是,当我以常规编辑器的身份打开视频进行编辑时,它会将超级用户字段集更改为编辑器字段集。
- 以超级用户身份打开管理模型 - http://joxi.ru/zAN5wWMIVjz429
- 以编辑器身份打开管理模型 - http://joxi.ru/p27LJPZiDNgeA7
- 现在超级用户设置了与编辑相同的字段 - http://joxi.ru/L21jko5TW0ydAX
我假设有某种模板缓存?
当用户是编辑者时,您将 self.fields
设置为 self.normaluser_fields
,但当用户是管理员时,您没有将 self.fields
设置回默认值。 ModelAdmin
对象在应用程序加载时创建,并在所有用户之间共享!
当管理员进入页面时将字段改回默认值并不能 100% 解决问题。当管理员和非管理员用户同时尝试进入编辑页面时,可能会出现竞争条件。他们都可以获得相同的字段。
与其重写get_form
,不如重写get_fields
方法更简单:
def get_fields(self, request):
if not hasattr(request.user, 'perms_list'):
request.user.perms_list = request.user.groups.values_list('name',flat=True)
if 'video_description_rewriter' in request.user.perms_list:
print('rewrite fields to normal')
return self.normaluser_fields
return self.fields
该方法不会覆盖 ModelAdmin
对象中的任何值,因此更改仅对一个用户可见。