Django 管理サイトで ManyToMany のオブジェクトを選択する際に、オブジェクトの数が増えてくるとデフォルトのままでは使いづらいので、少しカスタマイズして使いやすくしてみようと思います。
Table of Contents
モデル例
まずは簡単にモデルを作ってみます。
ブログサイトやニュースサイトなんかでよく見かけるパターンです。タグおよび関連記事として自身のモデルにリレーションを張っています。
admin.py
管理サイトでモデルを編集できるようにしましょう。
では、Django 管理サイトにログインして見てみましょう。スーパーユーザを作成してあるていで話を進めます。
デフォルトではこんな感じです。選択した対オブジェクトは背景色が変わりますが、対オブジェクトの数が増えてくるとスクロールに隠れてしまうため視認性が低下します。
filter_horizontal
DjangoのModelAdmin
にはインターフェイスをカスタマイズするためのオプションがいくつか用意されています。filter_horizontal
というオプションが良さげなのでこれを使ってみましょう。
ModelAdmin
のサブクラスを作ってオプションを指定するだけです。
選択した対オブジェクトは右のボックスに表示されます。見やすくなりましたね。検索フィルタもついて便利です。
formfield_for_manytomany
さらにformfield_for_manytomany
メソッドをオーバーライドして初期表示を変更することもできます。
ここではタグを名前の昇順にソートしています。
実際には、オブジェクトにフィルタをかける使い方が多いかもしれません。