2

全部,

我有一个几乎可以工作的 MultiValueField 表单。它使用一个choicefield 和charfield(带有相应的Select 和TextInput 用于小部件)::

custom_choices = [("one","one"),("two","two"),("other","other")]

class MyMultiWidget(forms.MultiWidget):
    def __init__(self,*args,**kwargs):
        widgets = (
            forms.Select(choices=custom_choices),
            forms.TextInput(),
        )
        super(MyMultiWidget, self).__init__(widgets,*args,**kwargs)

    def decompress(self, value):
        if value:
            return value.split("|")
        return ['', '']

class MyMultiValueField(forms.MultiValueField):
    def __init__(self, *args, **kwargs):
        fields = (
            forms.ChoiceField(required=True),
            forms.CharField(max_length=128,required=False),
        )
        super(MyMultiValueField, self).__init__(fields, *args, **kwargs)
        self.widget = TestMultiWidget()

    def compress(self, data_list):
        if data_list:
            return '|'.join(data_list)

class MyTestField(models.Field):
    def formfield(self, **kwargs):
        return super(MyTestField, self).formfield(form_class=MyMultiValueField)

class MyModel(models.Model):
    myField = MyTestField()

压缩功能似乎正在工作;它按预期返回两个字符串的列表。但解压缩中的“值”参数始终为无。果然,当我直接查看数据库时,myField 列始终设置为 null。任何想法压缩和解压缩之间发生了什么?为什么 compress 的值实际上没有被存储?

谢谢。

4

1 回答 1

1

您应该从某些实际包含数据的字段继承 MyTestField。在您的情况下,它可以是 CharField 或 TextField。我认为它会解决问题。

于 2012-05-05T04:21:31.890 回答