より優れたDjango管理者ManyToManyフィールドウィジェット


101

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

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

ありがとう。

回答:


160

filter_horizontalたとえば、管理クラスで属性を使用してみてください。

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

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


すごい!これはまさに私が探しているもののように聞こえます。試してみましょう。
クリスW.

その動作しかし、このフィールドを読み取り専用にする方法。私はread only_fields =( 'users'、)を試してみます。ただし、カンマで区切られた1行で表示されます。改行で表示したい...
Varnan K 2014

自分のウィジェットを書かないといけないと心配していましたが、これは完璧です!それをありがとう!; P
umat

7

あなたは管理者で生のIDを使用してみることができます およびdjango docs:http : //docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

オートコンプリートで何かを探しているなら、これを出発点として見たいかもしれませんhttp://code.djangoproject.com/wiki/AutoCompleteSolutions

そして最後に、非常に単純なインラインの例:

models.py

class SomeModel(models.Model):
    users = models.ManyToMany(User)

admin.py:

class SomeModelAdmin(admin.ModelAdmin):
    raw_id_fields = ("users",)

3

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

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


0

これは古い質問ですが、私と同じようにこれを見つけた人のためにここに回答を追加したいと思います。この状況は、まさにDjangoインライン管理者が対象とするものです。具体的には、選択肢が多すぎる多対多の関係に対して、未加工のIDフィールドを持つTabularInlinesを使用します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.