2010-04-11 1 views
5

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?

Antwort

12

queryset ist eine Methode auf ModelAdmin, die ein Abfrage-Set zurückgibt. Sie müssen es in Ihrer EntryAdmin Klasse überschreiben.

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

Durch Ändern des Abfrage-Sets werden die in der Listenansicht angezeigten Einträge eingeschränkt. Sie müssen auch has_change_permission überschreiben, um sicherzustellen, dass der Benutzer die Berechtigung zum Bearbeiten des Objekts auf der Seite zum Bearbeiten einzelner Objekte hat. Sehen Sie im folgenden Blog-Post von James Bennett für weitere Details:

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

+0

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

Verwandte Themen