Wie kann ich mehr als einen ModelAdmin für dasselbe Modell erstellen, die jeweils unterschiedlich angepasst und mit unterschiedlichen URLs verknüpft sind?
Angenommen, ich habe ein Django-Modell namens Posts. Standardmäßig listet die Administratoransicht dieses Modells alle Post-Objekte auf.
Ich weiß, dass ich die Liste der auf der Seite angezeigten Objekte auf verschiedene Arten anpassen kann, indem ich Variablen wie list_display einstelle oder die queryset
Methode in meinem ModelAdmin wie folgt überschreibe :
class MyPostAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date')
def queryset(self, request):
request_user = request.user
return Post.objects.filter(author=request_user)
admin.site.register(MyPostAdmin, Post)
Standardmäßig ist dies über die URL zugänglich /admin/myapp/post
. Ich möchte jedoch mehrere Ansichten / ModelAdmins desselben Modells haben. z. B. /admin/myapp/post
würde alle Beitragsobjekte auflisten und /admin/myapp/myposts
würde alle Beiträge auflisten, die dem Benutzer gehören, und /admin/myapp/draftpost
könnte alle Beiträge auflisten, die noch nicht veröffentlicht wurden. (Dies sind nur Beispiele, mein tatsächlicher Anwendungsfall ist komplexer)
Sie können nicht mehr als einen ModelAdmin für dasselbe Modell registrieren (dies führt zu einer AlreadyRegistered
Ausnahme). Idealerweise möchte ich dies erreichen, ohne alles in eine einzelne ModelAdmin-Klasse zu packen und meine eigene URL-Funktion zu schreiben, um abhängig von der URL einen anderen Abfragesatz zurückzugeben.
Ich habe mir die Django-Quelle angesehen und sehe, ModelAdmin.changelist_view
dass solche Funktionen irgendwie in meiner urls.py enthalten sein könnten, aber ich bin mir nicht sicher, wie das genau funktionieren würde.
Update : Ich habe einen Weg gefunden, um das zu tun, was ich will (siehe unten), aber ich würde immer noch gerne andere Wege hören, dies zu tun.
quelle
Die Antwort von Paul Stone ist absolut großartig! Nur um hinzuzufügen, für Django 1.4.5 musste ich meine benutzerdefinierte Klasse von erben
admin.ModelAdmin
quelle