web-dev-qa-db-ja.com

Django AdminのチェックボックスとしてManyToManyFieldを表示する

Django AdminのチェックボックスとしてManyToManyFieldを表示する簡単な方法はありますか?よろしくお願いします!

26
eos87

この回答 から 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_fieldsradio_fieldsが独自のカスタムウィジェットを暗示しているためです。

57
Shawn Chin

これは間違いなく可能です。 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)

これは、管理コードを調べた結果です。

4
vdboor

単一のフィールドをオーバーライドするには、以下が役立ちます。

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
4
rbell01824

これを行う簡単な方法はないと思います。 ModelAdminクラスのオーバーライドを試みることができますが、これは「単純な」方法ではありません。

ただし、filter_horizo​​ntalまたはfilter_verticalを使用して、ほぼ同様の機能を追加できます。

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#Django.contrib.admin.ModelAdmin.filter_horizo​​ntal

0
errx