看看这个例子
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.
我当前的解决方案涉及使用 aTextField
而不是 aDecimalField
并为IsNumeric
验证器提供如下调用方法:
def __call__(self, form, field):
if field.data:
try:
field.data = float(field.data)
except ValueError as e:
raise ValidationError(self.message)
这几乎完美地工作,并且是我目前的解决方案,但肯定必须有一种 wtforms 惯用的方式来做到这一点。