同じモデルに対して複数のModelAdminを作成し、それぞれを異なる方法でカスタマイズし、異なるURLにリンクするにはどうすればよいですか?
PostsというDjangoモデルがあるとします。デフォルトでは、このモデルの管理ビューにはすべてのPostオブジェクトがリストされます。
list_displayなどの変数を設定するかqueryset
、ModelAdminでメソッドをオーバーライドすることで、ページに表示されるオブジェクトのリストをさまざまな方法でカスタマイズできることを知っています。
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)
デフォルトでは、URLからアクセスできます/admin/myapp/post
。ただし、同じモデルの複数のビュー/ ModelAdminsが欲しいです。たとえば/admin/myapp/post
、すべての投稿オブジェクト/admin/myapp/myposts
を一覧表示し、ユーザーに属する/admin/myapp/draftpost
すべての投稿を一覧表示し、まだ公開されていないすべての投稿を一覧表示する場合があります。(これらは単なる例であり、実際の使用例はより複雑です)
同じモデルに複数のModelAdminを登録することはできません(これによりAlreadyRegistered
例外が発生します)。理想的には、すべてを1つのModelAdminクラスに入れずに独自の「urls」関数を記述して、URLに応じて異なるクエリセットを返すことなく、これを実現したいと考えています。
Djangoのソースを確認したところ、ModelAdmin.changelist_view
そのような関数がどういうわけか私のurls.pyに含まれている可能性がありますが、それがどのように機能するのか正確にはわかりません。
更新:自分がやりたいことを行う方法を1つ見つけました(下記を参照)が、これを行う他の方法については引き続き聞きたいです。