我一直在子类化 multiwidget 以使用以下代码创建与 NumberInput 字段同步的 HTML5 范围滑块:
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()}
,小部件工作正常:更改滑块或数字输入确实会更改其他字段。但是,在执行 POST 时,表单无法验证,并且我在 form.errors 中收到此错误(对于 3 个参数):
[{'value': ['输入一个数字。']}, {'value': ['输入一个数字。']}, {'value': ['输入一个数字。']}]
单独的小部件运行良好并且表单被正确绑定。但不是在multiwidget中。我究竟做错了什么?我添加了
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])]
但这仍然不起作用。
谢谢你的帮助。