ChoiceField
モデルで生成された選択肢を保持しながら、Djangoのデフォルトウィジェットをオーバーライドしようとしています。これが私のモデルの関連部分です:
class UserGroup(models.Model):
icon = models.CharField(max_length=100, choices=<function call>)
そして私の形の:
class UserGroupForm(forms.ModelForm):
icon = models.ChoiceField(widget=IconPicker)
class Meta:
model = UserGroup
fields = [ 'icon', ]
ChoiceField
このようにのウィジェットをオーバーライドするform.fields['icon'].choices
と、通常はモデルから継承される属性が上書きされ[]
、Djangoのためにに設定されます。フォームからフィールド定義を削除するicon
と、選択肢は保持されますが、もちろんウィジェットのデフォルトはSelect
。です。
(モデルフィールドの選択肢を生成する関数は、残念ながらフォームコードからアクセスできません。)
私がこれまでに思いついた最善の方法は、icon
フォームフィールドの定義を次のように変更することです。
icon = ChoiceField(choices=UserGroup._meta.get_field_by_name('icon')[0].choices,
widget=IconPicker)
しかし、これは不格好であり、内省されたChoiceField
動作のように、選択肢が自動的に渡されるようにしたいと思います。(私はサブクラス化を試みChoiceField
ましIconChoiceField
たが、デフォルトのウィジェットはですが、この問題のためにDjangoはデフォルトのウィジェットを使用してIconPicker
に変換し直します。)TypedChoiceField
Select
モデルから 継承する動作を維持しながら、ChoiceField
の属性をオーバーライドする方法はありますか?widget
choices