显示不同的模型管理员 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)

对我有用。但是,当我以常规编辑器的身份打开视频进行编辑时,它会将超级用户字段集更改为编辑器字段集。

  1. 以超级用户身份打开管理模型 - http://joxi.ru/zAN5wWMIVjz429
  2. 以编辑器身份打开管理模型 - http://joxi.ru/p27LJPZiDNgeA7
  3. 现在超级用户设置了与编辑相同的字段 - 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 对象中的任何值,因此更改仅对一个用户可见。