Comment puis-je créer plusieurs ModelAdmin pour le même modèle, chacun étant personnalisé différemment et lié à des URL différentes?
Disons que j'ai un modèle Django appelé Posts. Par défaut, la vue d'administration de ce modèle répertorie tous les objets Post.
Je sais que je peux personnaliser la liste des objets affichés sur la page de différentes manières en définissant des variables telles que list_display ou en remplaçant la queryset
méthode dans mon ModelAdmin comme ceci:
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)
Par défaut, cela serait accessible à l'URL /admin/myapp/post
. Cependant, je voudrais avoir plusieurs vues / ModelAdmins du même modèle. par exemple /admin/myapp/post
, listerait tous les objets de publication, /admin/myapp/myposts
listerait tous les messages appartenant à l'utilisateur, et /admin/myapp/draftpost
pourrait lister tous les messages qui n'ont pas encore été publiés. (ce ne sont que des exemples, mon cas d'utilisation actuel est plus complexe)
Vous ne pouvez pas enregistrer plus d'un ModelAdmin pour le même modèle (cela entraîne une AlreadyRegistered
exception). Idéalement, j'aimerais y parvenir sans tout mettre dans une seule classe ModelAdmin et sans écrire ma propre fonction `` urls '' pour renvoyer un ensemble de requêtes différent en fonction de l'URL.
J'ai jeté un coup d'œil à la source Django et je vois des fonctions comme ModelAdmin.changelist_view
celle-là qui pourraient d'une manière ou d'une autre être incluses dans mon urls.py, mais je ne sais pas exactement comment cela fonctionnerait.
Mise à jour : j'ai trouvé un moyen de faire ce que je veux (voir ci-dessous), mais j'aimerais toujours entendre d'autres façons de le faire.
la source
La réponse de Paul Stone est absolument géniale! Juste pour ajouter, pour Django 1.4.5 j'avais besoin d'hériter de ma classe personnalisée de
admin.ModelAdmin
la source