Como posso criar mais de um ModelAdmin para o mesmo modelo, cada um personalizado de forma diferente e vinculado a URLs diferentes?
Digamos que eu tenho um modelo do Django chamado Posts. Por padrão, a visualização de administrador deste modelo listará todos os objetos de postagem.
Eu sei que posso personalizar a lista de objetos exibidos na página de várias maneiras, definindo variáveis como list_display ou substituindo o queryset
método no meu ModelAdmin da seguinte maneira:
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 padrão, isso estaria acessível no URL /admin/myapp/post
. No entanto, eu gostaria de ter várias visualizações / ModelAdmins do mesmo modelo. por exemplo /admin/myapp/post
, listaria todos os objetos de postagem e /admin/myapp/myposts
listaria todas as postagens pertencentes ao usuário e /admin/myapp/draftpost
pode listar todas as postagens que ainda não foram publicadas. (estes são apenas exemplos, meu caso de uso real é mais complexo)
Você não pode registrar mais de um ModelAdmin para o mesmo modelo (isso resulta em uma AlreadyRegistered
exceção). Idealmente, eu gostaria de conseguir isso sem colocar tudo em uma única classe ModelAdmin e escrever minha própria função 'urls' para retornar um conjunto de consultas diferente, dependendo da URL.
Eu dei uma olhada na fonte do Django e vejo funções como ModelAdmin.changelist_view
essa que de alguma forma podem ser incluídas no meu urls.py, mas não tenho certeza exatamente como isso funcionaria.
Atualização : Encontrei uma maneira de fazer o que quero (veja abaixo), mas ainda gostaria de ouvir outras maneiras de fazer isso.
fonte
A resposta de Paul Stone é absolutamente ótima! Apenas para adicionar, para o Django 1.4.5 eu precisava herdar minha classe personalizada de
admin.ModelAdmin
fonte