Допустим, у меня есть сайт, где пользователи могут добавлять записи через админ-панель. У каждого пользователя есть своя собственная категория, за которую он отвечает (для каждой категории есть редактор, назначенный через ForeingKey / ManyToManyField).
Когда пользователь добавляет запись, я ограничиваю выбор с помощью 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)
Таким образом, я могу ограничить категории, к которым пользователь может добавить запись, и это прекрасно работает.
Теперь сложная часть: на странице списка изменений / действий в Entry я хочу показать только те записи, которые принадлежат к категории текущего пользователя. Я пытался сделать это, используя этот метод:
def changelist_view(self, request, extra_context=None):
if not request.user.is_superuser:
self.queryset = self.queryset.filter(editors=request.user)
Но я получаю эту ошибку:
AttributeError: у объекта 'function' нет атрибута 'filter'
Это странно, потому что я подумал, что это должен быть типичный QuerySet. В основном такие методы плохо документированы , и копаться в тоннах кода Django - не мой любимый вид спорта.
Есть идеи, как мне достичь своей цели?