¿Cómo puedo crear más de un ModelAdmin para el mismo modelo, cada uno personalizado de manera diferente y vinculado a diferentes URL?
Digamos que tengo un modelo de Django llamado Posts. De forma predeterminada, la vista de administrador de este modelo enumerará todos los objetos de publicación.
Sé que puedo personalizar la lista de objetos que se muestran en la página de varias maneras estableciendo variables como list_display o anulando el queryset
método en mi ModelAdmin de la siguiente manera:
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)
Por defecto, esto sería accesible en la URL /admin/myapp/post
. Sin embargo, me gustaría tener múltiples vistas / ModelAdmins del mismo modelo. por ejemplo /admin/myapp/post
, enumeraría todos los objetos de publicación y /admin/myapp/myposts
enumeraría todas las publicaciones que pertenecen al usuario, y /admin/myapp/draftpost
podría enumerar todas las publicaciones que aún no se han publicado. (estos son solo ejemplos, mi caso de uso real es más complejo)
No puede registrar más de un ModelAdmin para el mismo modelo (esto da como resultado una AlreadyRegistered
excepción). Idealmente, me gustaría lograr esto sin poner todo en una sola clase ModelAdmin y escribir mi propia función 'urls' para devolver un conjunto de consultas diferente dependiendo de la URL.
He echado un vistazo a la fuente de Django y veo que funciones como ModelAdmin.changelist_view
esa podrían incluirse de alguna manera en mi urls.py, pero no estoy seguro de cómo funcionaría.
Actualización : He encontrado una forma de hacer lo que quiero (ver más abajo), pero todavía me gustaría escuchar otras formas de hacerlo.
fuente
¡La respuesta de Paul Stone es absolutamente genial! Solo para agregar, para Django 1.4.5 necesitaba heredar mi clase personalizada de
admin.ModelAdmin
fuente