Eri*_*c P 4 django django-models django-forms
我试图覆盖Django的默认小部件,ChoiceField同时保留模型中生成的选择.这是我模型的相关部分:
class UserGroup(models.Model):
icon = models.CharField(max_length=100, choices=<function call>)
Run Code Online (Sandbox Code Playgroud)
我的形式:
class UserGroupForm(forms.ModelForm):
icon = models.ChoiceField(widget=IconPicker)
class Meta:
model = UserGroup
fields = [ 'icon', ]
Run Code Online (Sandbox Code Playgroud)
覆盖ChoiceField像这个clobbers的小部件,该form.fields['icon'].choices属性通常从模型继承并将其设置为,[]因为Django.如果我icon从表单中删除字段定义,则保留选项 - 但当然窗口小部件默认为a Select.
(遗憾的是,无法从表单代码中访问生成模型字段选项的函数.)
到目前为止,我提出的最好的方法是将icon表单字段定义更改为
icon = ChoiceField(choices=UserGroup._meta.get_field_by_name('icon')[0].choices,
widget=IconPicker)
Run Code Online (Sandbox Code Playgroud)
但这很笨重,我宁愿自动传递选择,就像在内省ChoiceField行为中一样.(我试过子类化ChoiceField到IconChoiceField这是相同的,但是对于一个默认的部件IconPicker,但Django的将其转换回TypedChoiceField用默认的Select,因为小部件这个问题.)
有没有办法覆盖ChoiceField's widget属性,同时保留choices从模型继承的行为?
我认为你失去你在模型中指定的选择的原因,即"设置为[]" 不是"因为Django",而是因为你用行覆盖了图标字段icon = models.ChoiceField(widget=IconPicker)
请注意,如果您使用的是modelform,则无需在init处覆盖窗口小部件,而应在窗口小部件字典中的Meta类中指定窗口小部件.
class UserGroupForm(forms.ModelForm):
class Meta:
model = UserGroup
fields = [ 'icon', ]
widgets = {
'icon': IconPicker
}
Run Code Online (Sandbox Code Playgroud)
至于覆盖您可以简单地做的选择self.fields['icon'].choices = UserGroupForm.ICON_CHOICES,但我认为您不需要在此实例中覆盖选项.
弄清楚了.只需要在UserGroupForms中进行一些自我引用__init__:
def __init__(self, *args, **kwargs):
super(UserGroupForm, self).__init__(*args, **kwargs)
self.fields['icon'].widget = IconPicker(choices=self.fields['icon'].choices)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5252 次 |
| 最近记录: |