Python Django multiwidget和验证问题
我一直在对multiwidget进行子类化,以使用以下代码创建与NumberInput字段同步的HTML5范围滑块:Python Django multiwidget和验证问题,python,django,django-multiwidget,Python,Django,Django Multiwidget,我一直在对multiwidget进行子类化,以使用以下代码创建与NumberInput字段同步的HTML5范围滑块: class SplitRangeNumberWidget(MultiWidget): def __init__(self): widgets = ( forms.NumberInput(attrs={'type':'range', '
class SplitRangeNumberWidget(MultiWidget):
def __init__(self):
widgets = (
forms.NumberInput(attrs={'type':'range',
'onchange':'this.nextElementSibling.value=this.value',
'oninput':'this.nextElementSibling.value=this.value',
'step':'any',
'min':0,
'max':1}),
forms.NumberInput(attrs={'step':'any',
'onchange':'this.previousElementSibling.value=this.value',
'oninput':'this.previousElementSibling.value=this.value',})
)
super(SplitRangeNumberWidget, self).__init__(widgets)
def decompress(self, value):
if value:
return [value, value]
return [None, None]
当我实例化它并以如下形式使用它时:
class ParameterForm(forms.ModelForm):
class Meta:
model = Parameter
fields = ['name','value','min_value','max_value']
widgets = {'value':SplitRangeNumberWidget()}
,小部件工作正常:更改滑块或numberinput会更改其他字段。但是,在执行POST时,表单不进行验证,我在form.errors(针对3个参数)中得到此错误:
[{'value':['Enter a number.]},{'value':['Enter a number.]},
{'value':['entarnumber.]}]
这些小部件本身工作得很好,表单绑定正确。但不是在多窗口小部件中。我做错了什么?我补充说
def value_from_datadict(self, data, files, name):
num = [widget.value_from_datadict(data, files, name + '_%s' % i)
for i, widget in enumerate(self.widgets)]
return [float(num[0]), float(num[1])]
但这仍然不起作用
谢谢你的帮助。我找到了解决方案:我需要实施
def value_from_datadict(self, data, files, name):
value_list = [widget.value_from_datadict(data, files, name + '_%s' % i)
for i, widget in enumerate(self.widgets)]
try:
value = value_list[0]
except ValueError:
return None
else:
return value
解释一下文档:来自_datadict()的值_的默认实现返回对应于每个小部件的值列表。当使用具有多值字段的多窗口小部件时,这是合适的,但由于我们希望将此窗口小部件与具有单个值的TextField一起使用,因此我们已重写此方法以将所有子窗口小部件的数据合并为一个值。
返回无
将丢弃无效数据,因此表单字段将为空。