django多值字段和多窗口小部件-使一个可选
这与我的一个朋友有关 我想有一个包含选项和文本输入小部件的多值字段。如果用户从选项中选择OTHER,则应保存TextInput的值。否则,应保存选项的值。到目前为止,我有以下代码:django多值字段和多窗口小部件-使一个可选,django,django-models,django-multiwidget,Django,Django Models,Django Multiwidget,这与我的一个朋友有关 我想有一个包含选项和文本输入小部件的多值字段。如果用户从选项中选择OTHER,则应保存TextInput的值。否则,应保存选项的值。到目前为止,我有以下代码: custom_choices = [("one","one"),("two","two"),("OTHER","OTHER")] class MyMultiWidget(forms.MultiWidget): def __init__(self,*args,**kwargs): widget
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中不包含值的内容时,就会出现一个验证错误,该字段是必需的。这是尽管上述要求=假kwarg
我试图给clean函数添加一些逻辑;如果选择小部件的值为其他值,则忽略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)
但这没有效果
有什么建议吗?清洁的正确版本应该如下所示:
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)
啊哈!结果表明,clean必须返回一个压缩值。所以clean的最后一行应该是:return |。joinvaluecompress和clean应该总是返回一些东西。我认为这个字段是必填字段,指的是整个字段,而不仅仅是它的第二部分。