Допустим, у меня есть сайт, на котором пользователи могут добавлять записи через панель администратора. У каждого пользователя есть своя категория, за которую он отвечает (каждая категория имеет редактора, назначенного через ForeingKey/ManyToManyField).
Когда пользователь добавляет Entry, я ограничиваю выбор с помощью 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: объект «функция» не имеет атрибута «фильтр»
Это странно, потому что я думал, что это должен быть типичный QuerySet. В основном такие методы плохо документированы и копаться в тоннах кода Django — не мой любимый вид спорта.
Любые идеи, как я могу достичь своей цели?