[解決済み] Django の管理画面で同じモデルに対して複数の ModelAdmins/view を表示する
質問
同じモデルに対して複数の 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
. しかし、私は同じモデルの複数のビュー/モデル管理者を持ちたいと考えています。
/admin/myapp/post
はすべての投稿オブジェクトをリストアップし
/admin/myapp/myposts
は、そのユーザーに属するすべての投稿をリストアップし
/admin/myapp/draftpost
は、まだ公開されていないすべての投稿をリストアップすることができます。(これらは単なる例です。私の実際のユースケースはもっと複雑です)
同じモデルに対して、複数の ModelAdmin を登録することはできません。
AlreadyRegistered
例外が発生します)。理想的には、次のように実現したいです。
なし
は、すべてを一つの ModelAdmin クラスにまとめ、URL に応じて異なるクエリセットを返すように独自の 'urls' 関数を記述します。
Django のソースを見たところ、以下のような関数がありました。
ModelAdmin.changelist_view
をどうにかして私のurls.pyに含めることができますが、それがどのように機能するのか正確にはわかりません。
更新情報 : 私が望むことを行うための1つの方法を見つけました(下記参照)が、私はまだ他の方法を聞きたいと思っています。
どのように解決するのですか?
各モデルが一度しか登録できないという事実を回避するためにプロキシモデルを使用することで、私が望むことを実現する一つの方法を見つけました。
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'pubdate','user')
class MyPost(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)
次に、デフォルトの
PostAdmin
でアクセスできるようになります。
/admin/myapp/post
で、そのユーザーが所有する投稿の一覧は
/admin/myapp/myposts
.
を見てから http://code.djangoproject.com/wiki/DynamicModels ということで、同じことをするために、以下のようなユーティリティ関数を思いつきました。
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
これは、次のように使うことができます。
class MyPostAdmin(PostAdmin):
def get_queryset(self, request):
return self.model.objects.filter(user = request.user)
create_modeladmin(MyPostAdmin, name='my-posts', model=Post)
関連
-
Python関数の高度な応用を解説
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
python implement mysql add delete check change サンプルコード
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].