我在模型中有CharField with
choices
,但我需要将此字段呈现为CheckboxSelectMultiple
,它会将列表返回给表单类。对于TypedChoiceField
表单类,它自动分配给Field
选项,它不会验证。我决定更改字段中的form_class
并使用TypedMultipleChoiceField
form_class
编写一个新字段,以验证列表。
class MultipleTypedChoiceModelField(models.Field):
def get_internal_type(self):
return 'MultipleTypedChoiceModelField'
def formfield(self, **kwargs):
defaults = {'form_class': TypedMultipleChoiceField, }
defaults.update(kwargs)
return super(MultipleTypedChoiceModelField, self).formfield(**defaults)
但它没有效果。如果我在模型字段中注释掉了选项,则类型为MultipleTypedChoiceModelField。所以我相信form_class是在设备中指定的,带有一个选择列表。
def formfield(self, **kwargs):
if self._choices: # or self.choices:
defaults = {'form_class': TypedMultipleChoiceField, }
defaults.update(kwargs)
return super(MultipleTypedChoiceModelField, self).formfield(**defaults)
但它也没有效果。 我没有找到form_class
的分配位置。也许我有更好的方法来改变这种行为? 添加一个具有多对多关系的额外模型我没有计划,因为它显然是不必要的。
答案 0 :(得分:1)
问题的一部分是,如果你的模型中有这样的东西:
myfield = models.CharField(max_length=100, choices=MY_FIELD_CHOICES)
Django将假设myfield只保留一个选项,坚持多种选择。
实现这一目标的最简单方法是在模型中使用类似的东西:
myfield = models.CharField(max_length=100)
然后以自定义形式:
myfield = forms.MultipleChoiceField(choices=MY_FIELD_CHOICES, widget=forms.CheckboxSelectMultiple())