Django 管理サイトのManyToManyFieldをカスタマイズ

KJ
3 min readMay 30, 2019

--

Django 管理サイトで ManyToMany のオブジェクトを選択する際に、オブジェクトの数が増えてくるとデフォルトのままでは使いづらいので、少しカスタマイズして使いやすくしてみようと思います。

Table of Contents

モデル例

まずは簡単にモデルを作ってみます。

ブログサイトやニュースサイトなんかでよく見かけるパターンです。タグおよび関連記事として自身のモデルにリレーションを張っています。

admin.py

管理サイトでモデルを編集できるようにしましょう。

では、Django 管理サイトにログインして見てみましょう。スーパーユーザを作成してあるていで話を進めます。

Post モデル作成画面

デフォルトではこんな感じです。選択した対オブジェクトは背景色が変わりますが、対オブジェクトの数が増えてくるとスクロールに隠れてしまうため視認性が低下します。

filter_horizontal

DjangoのModelAdminにはインターフェイスをカスタマイズするためのオプションがいくつか用意されています。filter_horizontalというオプションが良さげなのでこれを使ってみましょう。

admin.py

ModelAdminのサブクラスを作ってオプションを指定するだけです。

filter_horizontal オプション使用

選択した対オブジェクトは右のボックスに表示されます。見やすくなりましたね。検索フィルタもついて便利です。

formfield_for_manytomany

さらにformfield_for_manytomanyメソッドをオーバーライドして初期表示を変更することもできます。

admin.py

ここではタグを名前の昇順にソートしています。

formfield_for_manytomany を変更

実際には、オブジェクトにフィルタをかける使い方が多いかもしれません。

--

--