0

このコードを使用して、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])]

しかし、これはまだ機能しません。

ご協力いただきありがとうございます。

4

1 に答える 1