【问题标题】:django multivaluefield & multiwidget - make one optionaldjango multivaluefield & multiwidget - 使一个可选
【发布时间】:2012-05-14 07:30:44
【问题描述】:

这与我的一个earlier question 有关。

我想要一个包含 Choice 和 TextInput 小部件的 MultiValueField。如果用户从 Choice 中选择“OTHER”,则应该保存 TextInput 的值。否则,应该保存 Choice 的值。到目前为止,我有以下代码:

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.CharField(max_length=128,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.CharField):
    def formfield(self, **kwargs):
        return super(MyTestField, self).formfield(form_class=MyMultiValueField)

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

但是,每当我尝试在 TextInput 中保存不包含值的内容时,都会收到验证错误“此字段是必需的”。尽管上面有“required=False”kwarg,但还是这样。

我尝试在 clean 函数中添加一些逻辑;如果 Choice 小部件的值为“OTHER”,则忽略 TextInput 的小部件:

def clean(self,value):
    if value[0]!="OTHER":
        value[1]=u''
    else:
        if not value[1]:
            msg = "unspecified value"
            raise forms.ValidationError(msg)
        elif "|" in value[1]:
            msg = "bad value ('|' character is not allowed"
            raise forms.ValidationError(msg)
    super(TestFormField,self).clean(value)

但这没有效果。

有什么建议吗?

【问题讨论】:

  • 啊哈!事实证明,clean 必须返回一个“压缩”值。所以 clean 的最后一行应该是:return "|".join(value)
  • compressclean 应该总是返回一些东西。我认为“这个字段是必需的”是指整个字段,而不仅仅是它的第二部分。

标签: django django-models django-multiwidget


【解决方案1】:

clean 的正确版本应该是这样的:

def clean(self,value):
    if value[0] != "OTHER":
        value[1] = u' '
    else:
        if value[1].strip() == u' ':
            msg = "unspecified value"
            raise forms.ValidationError(msg)
        elif "|" in value[1]:
            msg = "bad value ('|' character is not allowed)"
            raise forms.ValidationError(msg)
    return "|".join(value)

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多