2

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也许我有更好的方法来改变这种行为?我不打算添加具有多对多关系的额外模型,因为这显然是不必要的。

4

1 回答 1

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())
于 2011-11-15T15:40:58.177 回答