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に変換し直します。)TypedChoiceFieldSelect
モデルから 継承する動作を維持しながら、ChoiceFieldの属性をオーバーライドする方法はありますか?widgetchoices