2011-01-24 21 views

答えて

47

this answerから、CheckBoxSelectMultipleを使用するのManyToManyFieldを上書きするModelAdmin.formfield_overridesを使用することが可能であるように思える:

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}, 
    } 

私はそれを試していないが、単にソースから引用していますが、それはもっともらしく思えます。がんばろう。

警告

あなたは関係フィールドでカスタムウィジェット を使用したい場合(すなわちForeignKey またはのManyToManyField@errxは当然、documentationハイライト以下の注意点を指摘したように)、 には、そのフィールドの名前が raw_id_fieldsまたはradio_fieldsに含まれていないことを確認してください。

formfield_overridesあなたはraw_id_fieldsまたは radio_fieldsセットを持っている関係フィールド 上のウィジェットを変更 せません。それは raw_id_fieldsradio_fieldsは 独自のカスタムウィジェットを意味するからです。

+0

djangoのドキュメントからの警告があります。 カスタムフィールドを関連フィールド(ForeignKeyまたはManyToManyField)とともに使用する場合は、そのフィールドの名前がraw_id_fieldsまたはradio_fieldsに含まれていないことを確認してください。 formfield_overridesでは、raw_id_fieldsまたはradio_fieldsが設定されている関連フィールドのウィジェットは変更できません。これは、raw_id_fieldsとradio_fieldsが独自のカスタムウィジェットを意味するためです。 – errx

+0

ヘッドアップありがとう。答えに警告を出します。 –

4

に追加するfilter_horizo​​ntalまたはfilter_vertical使用することができます。

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) 

これは、管理者コードに探してから派生した:ここでは、ModelAdminサブクラスに置くことができるコードです。以下の単一のフィールド用に上書きするために

4

に便利です:私は訪問者を混同しないように、受け入れ答えを変更することをお勧め

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 
関連する問題