【问题标题】:WTForms: IntegerField skips coercion when string value is '0'WTForms:当字符串值为“0”时,IntegerField 跳过强制转换
【发布时间】:2014-10-09 17:15:38
【问题描述】:

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 来保持它与类型无关,但这完全违背了这样做的目的。

【问题讨论】:

标签: python flask wtforms flask-wtforms


【解决方案1】:

恐怕您必须保持该类型不可知,并改用 InputRequired :-)

here 的文档说:

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

实际的代码cuplrit略低于第201行:

if not field.data

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2014-04-30
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多