首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对空字符串不验证的IntegerField

对空字符串不验证的IntegerField
EN

Stack Overflow用户
提问于 2017-10-16 01:53:57
回答 2查看 3.2K关注 0票数 3

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

代码语言:javascript
运行
复制
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到目录,然后运行以下命令:

代码语言:javascript
运行
复制
virtualenv flask
source flask/bin/activate
pip install flask flask-wtf
export FLASK_APP=app.py
python3 app.py

在web浏览器中连接到localhost:5000。在表单字段中键入一个整数并提交将显示“验证的表单!”在字段中键入非整数的内容,或将字段留为空白,然后提交只需重新加载页面。这确实是有意义的,因为不能将"“强制为整数。

我想让我的IntegerField变成空的。我认为解决方案是子类IntegerField和验证()。我有:

代码语言:javascript
运行
复制
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吗?
EN

回答 2

Stack Overflow用户

发布于 2018-07-01 08:01:01

Optional验证器允许表单字段上的空条目。

代码语言:javascript
运行
复制
>>> 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

来自文档

类wtforms.validators.Optional(strip_whitespace=True) 允许空输入并停止验证链的继续。 如果输入为空,还将从字段中删除先前的错误(例如处理错误)。

票数 6
EN

Stack Overflow用户

发布于 2019-06-17 19:13:47

这样就行了..。

代码语言:javascript
运行
复制
score = IntegerField('Score', validators=[Optional(strip_whitespace=True)])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46761931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档