2016-03-10 6 views
1

В django У меня есть суперпользователь и группа редакторов контента.Показать другую модель admin list_display и поля, установленные для разных групп пользователей

Когда я редактирую модель как суперпользователя, я хочу иметь возможность редактировать все поля. И если кто-то вошел в систему как редактор, я хочу разрешить ему редактировать только определенные поля.

Я сделал это с 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

Я предполагаю, что есть какое-то кэширования шаблонов?

ответ

1

Вы устанавливаете self.fields на self.normaluser_fields, когда пользователь является редактором, но вы не устанавливаете self.fields на значение по умолчанию, когда пользователь является администратором. ModelAdmin объекты создаются при загрузке приложения, и они распределяются между всеми пользователями!

Изменение полей до значения по умолчанию при входе администратора на страницу не решит проблему в 100% процентах. Когда пользователь admin и non-admin попытается ввести страницу редактирования в одно и то же время, может возникнуть условие гонки. Оба они могут получать одинаковые поля.

Вместо переписано 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 объекта, поэтому изменения будут видны только для одного пользователя.

 Смежные вопросы

  • Нет связанных вопросов^_^