Angenommen, ich habe eine Website, auf der Benutzer Einträge über das Admin-Panel hinzufügen können. Jeder Benutzer hat seine eigene Kategorie, für die er verantwortlich ist (jeder Kategorie ist ein Editor zugewiesen, der über ForeingKey/ManyToManyField zugewiesen wurde).Wie filtert man das Anfrage-Set in changelist_view in django admin?
Wenn Benutzereintrag hinzufügt, beschränke ich die Entscheidungen, durch wie dies mit 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)
So kann ich die Kategorien beschränken kann, auf die ein Benutzereintrag hinzufügen können und es funktioniert perfekt.
Nun der knifflige Teil: Auf der Änderungsliste Eintrag/Aktion möchte ich nur die Einträge anzeigen, die zur aktuellen Benutzerkategorie gehören. Ich habe versucht, dies mit dieser Methode zu tun:
def changelist_view(self, request, extra_context=None):
if not request.user.is_superuser:
self.queryset = self.queryset.filter(editors=request.user)
Aber ich bekomme diese Fehlermeldung:
AttributeError: 'function' object has no attribute 'filter'
Das ist seltsam, weil ich dachte, es sollte ein typisches QuerySet sein. Grundsätzlich sind solche Methoden not well documented und das Graben durch Tonnen von Django-Code ist nicht mein Lieblingssport.
Irgendwelche Ideen, wie kann ich mein Ziel erreichen?
Die QuerySet nach Kategorie gefiltert werden muss. Aber es gibt ein Problem, wenn Benutzer mehr als eine Kategorie zugewiesen hat. Oder vielleicht vermisse ich etwas. – minder