IntegerField没有验证空字符串

时间:2017-10-16 01:53:58

标签: wtforms flask-wtforms

我发现IntegerField在空时不会验证。要重现,请复制以下块:

from flask import Flask, render_template_string
from flask_wtf import FlaskForm
from wtforms import IntegerField

app = Flask(__name__)
app.config['WTF_CSRF_ENABLED'] = False

class DemoForm(FlaskForm):
    demofield = IntegerField('demofield')

@app.route('/', methods=("GET","POST"))
def index():
    form = DemoForm()
    if form.validate_on_submit():
        return ("The form validated!")
    return render_template_string("<!DOCTYPE HTML> This is my form! <form method=\"post\">{% for field in form %}{{field}}{% endfor %}<input type=\"submit\">", form=form)

app.run(debug=True)

并将其作为app.py保存在自己的目录中。然后打开一个终端,cd到目录,然后运行以下命令:

virtualenv flask
source flask/bin/activate
pip install flask flask-wtf
export FLASK_APP=app.py
python3 app.py

在网络浏览器中连接到localhost:5000。在表单字段中输入一个整数并提交将显示&#34;表单已验证!&#34;在字段中键入不是整数的内容,或将字段留空,然后提交只重新加载页面。这确实有道理,因为&#34;&#34;不能被强制转换为整数。

我想让我的IntegerField为空。我认为解决方案是将IntegerField和override pre_validate() or post_validate()子类化。我有:

class OptionalIntegerField(IntegerField):
    def post_validate(self, form, validation_stopped):
        print("post_validate is being called")
        if (self.data in (None, "")):
            return True

我的问题是:

  • 是否正在继承并覆盖正确的解决方案?
  • 如果是这样,我是否覆盖pre_validate(),post_validate()或两者,以及如何?我需要return True在他们内部吗?

2 个答案:

答案 0 :(得分:2)

Optional验证器允许在表单字段上输入空白。

>>> from webob.multidict import MultiDict

>>> class F(Form):
...     foo = IntegerField(validators=[validators.Optional()])

>>> f = F(formdata=MultiDict(foo=1))
>>> f.validate()
True
>>> f = F(formdata=MultiDict(foo=''))
>>> f.validate()
True
>>> f = F(formdata=MultiDict(foo='a'))
>>> f.validate()
False

来自docs

  

wtforms.validators.Optional(strip_whitespace = True)

     

允许输入为空,并停止验证链继续。

     

如果输入为空,还将从该字段中删除先前的错误(例如处理错误)。

答案 1 :(得分:0)

这会完成...

score = IntegerField('Score', validators=[Optional(strip_whitespace=True)])