如何将TypedChoiceField指定为表单类来为带有选择的Field建模?

时间:2011-11-15 13:04:01

标签: django django-forms django-widget django-models

我在模型中有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的分配位置。也许我有更好的方法来改变这种行为? 添加一个具有多对多关系的额外模型我没有计划,因为它显然是不必要的。

1 个答案:

答案 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())