2017-01-09 51 views
0

我一直在继承multiwidget创建使用此代码与NumberInput场同步的HTML5范围滑块:当我实例化和使用它的形式,例如Django的multiwidget和验证问题

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。']},{ '值':[ '输入一个数字。']},{ '值':[ '输入一个数字。']}]

单独的窗口小部件不工作良好并形成正确绑定。但不是在多人桌上。我究竟做错了什么?我加了

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])] 

但是这仍然不起作用。

感谢您的帮助。

回答

0

我找到了解决办法:我需要实现

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 

套用的文档:value_from_datadict的默认实现()返回对应于每个控件的值的列表。将MultiWidget与MultiValueField一起使用时适用,但由于我们想要使用带有单个值的TextField的此小部件,因此我们重写了此方法以将所有子小部件的数据组合到一个值中。