このコードを使用して、NumberInput フィールドと同期する HTML5 レンジ スライダーを作成するために 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 つのパラメーターの場合):
[{'value': ['数値を入力してください。']}, {'value': ['数値を入力してください']}, {'value': ['数値を入力してください']}]
ウィジェットだけでもうまく機能し、フォームは正しくバインドされています。しかし、マルチウィジェットではありません。私は何を間違っていますか?追加した
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])]
しかし、これはまだ機能しません。
ご協力いただきありがとうございます。