Jak mogę utworzyć więcej niż jednego ModelAdmin dla tego samego modelu, każdy dostosowany w inny sposób i połączony z różnymi adresami URL?
Powiedzmy, że mam model Django o nazwie Posty. Domyślnie widok administratora tego modelu zawiera listę wszystkich obiektów Post.
Wiem, że mogę dostosować listę obiektów wyświetlanych na stronie na różne sposoby, ustawiając zmienne, takie jak list_display lub zastępując queryset
metodę w moim ModelAdmin w następujący sposób:
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)
Domyślnie byłoby to dostępne pod adresem URL /admin/myapp/post
. Chciałbym jednak mieć wiele widoków / ModelAdmins tego samego modelu. np. wyświetli /admin/myapp/post
listę wszystkich obiektów postów i /admin/myapp/myposts
wyświetli wszystkie posty należące do użytkownika i /admin/myapp/draftpost
może wyświetlić wszystkie posty, które nie zostały jeszcze opublikowane. (to tylko przykłady, mój rzeczywisty przypadek użycia jest bardziej złożony)
Nie można zarejestrować więcej niż jednego ModelAdmin dla tego samego modelu (powoduje to AlreadyRegistered
wyjątek). Idealnie chciałbym to osiągnąć bez umieszczania wszystkiego w jednej klasie ModelAdmin i pisania własnej funkcji „urls”, która zwraca inny zestaw zapytań w zależności od adresu URL.
Rzuciłem okiem na źródło Django i widzę, ModelAdmin.changelist_view
że takie funkcje mogą być w jakiś sposób zawarte w moim urls.py, ale nie jestem pewien, jak to dokładnie działałoby.
Aktualizacja : znalazłem jeden sposób robienia tego, co chcę (patrz poniżej), ale nadal chciałbym usłyszeć, jak to zrobić.
źródło
Odpowiedź Paula Stone'a jest absolutnie świetna! Dodam, że dla Django 1.4.5 musiałem odziedziczyć moją klasę niestandardową z
admin.ModelAdmin
źródło