【问题标题】:wtfroms validation doesn't seem to work after changing field data on serverside在服务器端更改字段数据后,wtforms 验证似乎不起作用
【发布时间】:2017-08-05 15:28:19
【问题描述】:

我正在尝试通过 ajax 和 wtforms 验证表单,我有一个包含这样一个字段的表单:

name = StringField('Name :', description = "enter your name", validators=[InputRequired(message='please enter your name')])

而我的服务器端代码是这样的:

@app.route('/validation', methods=['get', 'post'])
def validation():
    data = request.get_json(force = True)
    myform = MyForm()
    for field in myform:
        field.data = data[field.name]
    myform.validate()
    return jsonify(myform.errors)

我通过 json 发送字段数据,然后将其设置为字段,我检查了它并且它的数据存在于 myform.data 但验证 InputRequired 错误后仍然存在响应。

【问题讨论】:

  • 有点不清楚。你能试着解释一下吗:)
  • 我从请求中获取表单数据的字典,我想在服务器端填写表单字段并验证它,当我通过我在问题中提到的 for 循环填充字段时,validate()方法似乎没有注意到变化,它在我的表单错误中返回 InputRequired 错误!
  • 你为什么要这么做?
  • 通过 ajax 验证表单。
  • 验证可以在表单类中完成。不确定在 views.py 中验证是否是好方法。

标签: flask wtforms


【解决方案1】:

您可以在表单类本身内验证表单。

class YouForm(FlaskForm):
    name = StringField('Name :', description = "enter your name", validators=[InputRequired(message='please enter your name')])

    def validate(self):
        valid = True
        if not self.name.data:
            self.name.errors.append('* Either file or text is required')
            valid = False
        return valid

这样您就可以简单地从views.py文件中的视图函数中调用validate方法进行验证。

【讨论】:

  • 如果我在表单中使用其他验证器怎么办?您的答案只适用于 InputRequired 验证器,应该有更好的方法。
  • 您的意思是,您的表单中有其他字段? “其他验证者”到底是什么意思?你能举个例子吗?
【解决方案2】:

如果您通过 ajax 发送数据并希望服务器端验证只需简单使用 request.form

@app.route('/validation', methods=['get', 'post'])
def validation():
    data = request.get_json(force = True)
    myform = MyForm(request.form)
    if myform.validate():
        #do something
        #return somthing
    else:
        return jsonify(myform.errors)

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多