python - theme - Varios ModelAdmins/views para el mismo modelo en Django admin
django tutorial (3)
¿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. Por defecto, la vista de administración de este modelo listará todos los objetos Post.
Sé que puedo personalizar la lista de objetos que se muestran en la página de varias maneras, estableciendo variables como list_display o reemplazando el método queryset
en mi ModelAdmin así:
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 vistas múltiples / ModelAdmins del mismo modelo. Por ejemplo, /admin/myapp/post
enumeraría todos los objetos de publicación, y /admin/myapp/myposts
mostrarí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 excepción AlreadyRegistered
). Idealmente, me gustaría lograr esto sin poner todo en una sola clase de ModelAdmin y escribir mi propia función ''urls'' para devolver un queryset diferente dependiendo de la URL.
He ModelAdmin.changelist_view
un vistazo a la fuente de Django y veo funciones como ModelAdmin.changelist_view
que de alguna manera podrían incluirse 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 a continuación), pero aún me gustaría escuchar otras formas de hacerlo.
¡La respuesta de Paul Stone es absolutamente genial! Solo para agregar, para Django 1.4.5 necesitaba heredar mi clase personalizada de admin.ModelAdmin
class MyPostAdmin(admin.ModelAdmin):
def queryset(self, request):
return self.model.objects.filter(id=1)
He encontrado una manera de lograr lo que quiero, mediante el uso de modelos proxy para evitar el hecho de que cada modelo puede registrarse solo una vez.
class PostAdmin(admin.ModelAdmin):
list_display = (''title'', ''pubdate'',''user'')
class MyPosts(Post):
class Meta:
proxy = True
class MyPostAdmin(PostAdmin):
def get_queryset(self, request):
return self.model.objects.filter(user = request.user)
admin.site.register(Post, PostAdmin)
admin.site.register(MyPost, MyPostAdmin)
Entonces, se podría acceder a PostAdmin por defecto en / admin / myapp / post y la lista de publicaciones propiedad del usuario sería en / admin / myapp / myposts.
Después de mirar http://code.djangoproject.com/wiki/DynamicModels , he encontrado la siguiente función de función para hacer lo mismo:
def create_modeladmin(modeladmin, model, name = None):
class Meta:
proxy = True
app_label = model._meta.app_label
attrs = {''__module__'': '''', ''Meta'': Meta}
newmodel = type(name, (model,), attrs)
admin.site.register(newmodel, modeladmin)
return modeladmin
Esto se puede usar de la siguiente manera:
class MyPostAdmin(PostAdmin):
def get_queryset(self, request):
return self.model.objects.filter(user = request.user)
create_modeladmin(MyPostAdmin, name=''my-posts'', model=Post)
solo use un list_filter o date_hierarchy.
date_hierarchy = ''pub_date''
list_filter = [''pub_date'',]