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来保持类型不可知,但这完全违背了这个目的。
答案 0 :(得分:2)
我担心您必须保持该类型不可知并改为使用InputRequired: - )
来自here的文档说:
“[...]这个验证器过去被称为必需但它的行为方式 (需要强制数据,而不是输入数据)意味着它以某种方式运行 这与可选验证器不对称,并且还导致了 与某些字段混淆,这些字段强迫数据变为'假的'值 0,十进制(0),时间(0)等除非有非常具体的原因 存在,我们建议使用:class:InputRequired。“
实际代码杯座位在第201行稍微低一点:
if not field.data