この例を見てください
class MyForm(ForM):
...snip...
quantity = DecimalField(u'Quantity', [NumberRange(1, 8)])
...snip...
これは、ユーザーが協力的で、数値型に強制できるものを入力した場合にうまく機能します。ただし、ユーザーが次のように入力した場合、ブラウザのこのフィールドに「asdf」と入力すると、ブラウザでレンダリングしようとするとがDecimalField
スローされます。Type Error
トレースバックの関連部分は次のとおりです。
Traceback (most recent call last):
File "/path/to/app/venv/local/lib/python2.7/site-packages/jinja2/environment.py", line 894, in render
return self.environment.handle_exception(exc_info, True)
File "/path/to/app/www/templates/submodule/user/submission.html", line 26, in block "submodule_content"
{{form.quantity}}
File "/path/to/app/venv/local/lib/python2.7/site-packages/wtforms/fields/core.py", line 139, in __call__
return self.widget(self, **kwargs)
File "/path/to/app/venv/local/lib/python2.7/site-packages/wtforms/widgets/core.py", line 123, in __call__
kwargs['value'] = field._value()
File "/path/to/app/venv/local/lib/python2.7/site-packages/wtforms/fields/core.py", line 542, in _value
return format % self.data
TypeError: a float is required
この動作の代わりに、フィールドにエラーを追加して、tをレンダリングできるようにします。
私の現在の解決策は、のTextField
代わりにを使用し、バリデーターに次のような呼び出しメソッドをDecimalField
提供することです。IsNumeric
def __call__(self, form, field):
if field.data:
try:
field.data = float(field.data)
except ValueError as e:
raise ValidationError(self.message)
これはほぼ完全に機能し、私の現在の解決策ですが、これを行うにはwtformsの慣用的な方法が必要です。