Предположим, у меня есть сайт, на котором пользователи могут добавлять записи через панель администратора. У каждого пользователя есть своя категория, за которую он отвечает (каждая категория имеет редактор, назначенный через 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 - не мой любимый вид спорта.
Любые идеи, как я могу достичь своей цели?
QuerySet должен быть отфильтрованы по категориям. Но есть проблема, когда пользователь имеет более одной категории. Или, может быть, я что-то упустил. – minder