2010-04-11 4 views
5

Предположим, у меня есть сайт, на котором пользователи могут добавлять записи через панель администратора. У каждого пользователя есть своя категория, за которую он отвечает (каждая категория имеет редактор, назначенный через ForeingKey/ManyToManyField).Как фильтровать запрос в changelist_view в django admin?

Когда пользователь добавляет запись, я ограничить выбор с помощью EntryAdmin так:

class EntryAdmin(admin.ModelAdmin): 
    (...) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == 'category': 
      if request.user.is_superuser: 
       kwargs['queryset'] = Category.objects.all() 
      else: 
       kwargs['queryset'] = Category.objects.filter(editors=request.user) 
      return db_field.formfield(**kwargs) 
     return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

Таким образом, я могу ограничить категории, к которой пользователь может добавить запись, и она работает идеально.

Теперь сложная часть: На странице редактирования списка действий/действия я хочу показать только те записи, которые относятся к текущей категории пользователей. Я пытался сделать это с помощью этого метода:

def changelist_view(self, request, extra_context=None): 
     if not request.user.is_superuser: 
      self.queryset = self.queryset.filter(editors=request.user) 

Но я получаю эту ошибку:

AttributeError: 'function' object has no attribute 'filter'

Это странно, потому что я думал, что это должно быть типичным QuerySet. В основном такие методы: not well documented, и копать тонны кода Django - не мой любимый вид спорта.

Любые идеи, как я могу достичь своей цели?

ответ

12

queryset - это метод на ModelAdmin, который возвращает запрос. Вам необходимо переопределить его на свой класс EntryAdmin.

def queryset(self, request): 
    qs = super(EntryAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    else: 
     return qs.filter(editors=request.user) 

Изменение набора запросов ограничивает записи, отображаемые в виде списка. Вам также необходимо переопределить has_change_permission, чтобы убедиться, что у пользователя есть разрешение на редактирование объекта на странице редактирования отдельного объекта. Смотрите следующий пост в блоге Джеймса Беннетта для получения более подробной информации:

http://www.b-list.org/weblog/2008/dec/24/admin/

+0

QuerySet должен быть отфильтрованы по категориям. Но есть проблема, когда пользователь имеет более одной категории. Или, может быть, я что-то упустил. – minder