Django AdminでManyToManyFieldをチェックボックスとして表示する簡単な方法はありますか?前もって感謝します!
4 に答える
この回答から、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が正しく指摘しているように、ドキュメントでは次の警告が強調されています。
リレーションフィールド(つまり 、ManyToManyField )でカスタムウィジェットを使用する場合は、そのフィールドの名前がまたはに含まれていないことを確認してください 。
ForeignKey
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を使用して、ほぼ同様の機能を追加できます