2017-01-09 4 views
0

私はこのコードを使用してNumberInputフィールドと同期したHTML5の範囲スライダを作成するmultiwidgetをサブクラス化されています: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()} 

、ウィジェットは正常に動作します。スライダーを変更するか、数値入力で他のフィールドが変更されます。しかし、POSTを実行すると、フォームは検証されず、このエラーがform.errors(3つのパラメータ)で取得されます:

[{'値':[数字を入力してください ']}、{ '値':[ '番号を入力してください。']}、{ '値':[ '番号を入力してください。']}]

ウィジェットが単独でうまく機能しないと、フォームが正しく結合されます。しかし、複数のウィジェットではありません。私は間違って何をしていますか?私は

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のデフォルトの実装を()各ウィジェットに対応する値のリストを返します。これはMultiValueFieldでMultiWidgetを使用する場合に適していますが、このウィジェットを単一の値を持つTextFieldで使用したいので、このメソッドをオーバーライドしてすべてのサブウィジェットのデータを値に結合しました。