WTForms:当字符串值为'0'时,IntegerField跳过强制

时间:2014-08-15 23:06:17

标签: python flask wtforms flask-wtforms

This question几乎涵盖了我在此之后的情况,但并不完全。

当字符串值为“0”时,IntegerField似乎会跳过强制。任何其他正整数似乎都可以正常工作。

以下是'0'的示例:

from wtforms import validators, Form, IntegerField
from webob.multidict import MultiDict

class TestForm(Form):
    num = IntegerField('How Many?', [validators.DataRequired('num required.'), validators.NumberRange(min=0, max=100)])

data_in = {'num': '0'}  # Note '0' is a string as would be POSTed
test_form = TestForm(formdata=MultiDict(data_in))
print("HTML Render: %s" % test_form.num())
print("     Validate: %s" % test_form.validate())
print("       Errors: %s" % test_form.errors)

输出是:

HTML Render: <input id="num" name="num" type="text" value="0">
     Validate: False
       Errors: {'num': ['num required.']}

另外,使用'66'的例子:

from wtforms import validators, Form, IntegerField
from webob.multidict import MultiDict

class TestForm(Form):
    num = IntegerField('How Many?', [validators.DataRequired('num required.'), validators.NumberRange(min=0, max=100)])

data_in = {'num': '66'}  # Note '66' is a string as would be POSTed
test_form = TestForm(formdata=MultiDict(data_in))
print("HTML Render: %s" % test_form.num())
print("     Validate: %s" % test_form.validate())
print("       Errors: %s" % test_form.errors)

其中包括:

HTML Render: <input id="num" name="num" type="text" value="66">
     Validate: True
       Errors: {}

是什么给出的?我可以使用InputRequired来保持类型不可知,但这完全违背了这个目的。

1 个答案:

答案 0 :(得分:2)

我担心您必须保持该类型不可知并改为使用InputRequired: - )

来自here的文档说:

“[...]这个验证器过去被称为必需但它的行为方式 (需要强制数据,而不是输入数据)意味着它以某种方式运行 这与可选验证器不对称,并且还导致了 与某些字段混淆,这些字段强迫数据变为'假的'值 0,十进制(0),时间(0)等除非有非常具体的原因 存在,我们建议使用:class:InputRequired。“

实际代码杯座位在第201行稍微低一点:

if not field.data