web-dev-qa-db-ja.com

より良いDjango Admin ManyToMany Field Widget

Django Adminのデフォルトmodels.ManyToManyField使用するのが面倒なウィジェット。 HTML select 要素であり、「他の」モデルのオブジェクトが多数ある場合、「この」オブジェクトに関連付ける「他の」オブジェクトを実際に見つけることは非常に非現実的です。また、a lotの「その他」モデルのオブジェクトがある場合は、管理者のレンダリングも遅くなるようです。ページ。

独自のカスタム管理ウィジェットを作成して、ManyToManyFieldsに適用できることは承知していますが、代わりに使用できるビルド済みのものはありますか?私の夢では、自動入力のテキスト入力HTMLウィジェットを想像します。これは、Django adminフレームワークで実行するのが実用的/可能ですか?

ありがとう。

93
Chris W.

Adminクラスでfilter_horizontal属性を使用してみてください。例:

class SomeModelAdmin(admin.ModelAdmin):
    filter_horizontal = ('users',)

ドキュメント で述べたように、「ManyToManyFieldをこのリストに追加すると、代わりに、オプション内での検索を可能にする気の利いた控えめなJavaScript「フィルター」インターフェースを使用します」。 filter_vertical は、わずかに異なるレイアウトで同じことを行います。

151
Blair

実際にプレイしたことはありませんが、他の場所で参照されている この有望なライブラリ が見つかりました。

まさに私が望んでいたことをするようです。関連オブジェクトのリスト全体をロードして(いくつあるかに関係なく!)、filter_horizontalは、検索/フィルターボックスを表示し、typeahead/autocomplete呼び出しを使用して結果を動的に取得します。これは、おそらく5000人のユーザーがいて、5k _を待たずに3人または4人を選択したい場合に最適です<option>ダウンロードしてレンダリングする要素。

3
Coderer

これは古い質問ですが、私がやったようにこれを見つけた人のためにここに答えを追加したいと思います:この状況はまさにDjangoインライン管理者の目的です。選択肢が多すぎる多対多リレーションの未加工IDフィールド。

https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#Django.contrib.admin.TabularInline

0
kloddant