Django AdminのチェックボックスとしてManyToManyFieldを表示する簡単な方法はありますか?よろしくお願いします!
この回答 から ModelAdmin.formfield_overrides を使用してManyToManyFieldをオーバーライドして使用できるようです CheckBoxSelectMultiple :
from Django.db import models
from Django.contrib import admin
from Django.forms import CheckboxSelectMultiple
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.ManyToManyField: {'widget': CheckboxSelectMultiple},
}
私はそれを試したことがなく、単に情報源から引用しているだけですが、それはもっともらしいようです。幸運を。
警告: @ errx 正しく指摘されているように、 ドキュメント は次の警告を強調しています:
リレーションフィールド(つまり、
ForeignKey
またはManyToManyField)でカスタムウィジェットを使用する場合は、そのフィールドの名前をraw_id_fields
またはradio_fields
に含めていません。
formfield_overrides
では、raw_id_fields
またはradio_fields
が設定されているリレーションフィールドのウィジェットを変更できません。これは、raw_id_fields
とradio_fields
が独自のカスタムウィジェットを暗示しているためです。
これは間違いなく可能です。 ModelAdmin
サブクラスに配置できるコードは次のとおりです。
def formfield_for_manytomany(self, db_field, request=None, **kwargs):
if db_field.name == 'your field name':
kwargs['widget'] = form_widgets.CheckboxSelectMultiple()
kwargs['help_text'] = ''
return db_field.formfield(**kwargs)
これは、管理コードを調べた結果です。
単一のフィールドをオーバーライドするには、以下が役立ちます。
def get_form(self, request, obj=None, **kwargs):
form = super(VNodeAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['node_type'].widget = forms.CheckboxSelectMultiple()
return form
これを行う簡単な方法はないと思います。 ModelAdminクラスのオーバーライドを試みることができますが、これは「単純な」方法ではありません。
ただし、filter_horizontalまたはfilter_verticalを使用して、ほぼ同様の機能を追加できます。