首页 > 解决方案 > Wtf 表单验证失败

问题描述

在下面给出 Form.py 文件:

        Form.py file: 
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, validators
from wtforms.validators import DataRequired, Length

# Define QuoteForm below
class QuoteForm(FlaskForm):
  qauthor = StringField("Quote Author", validators =[Length(min=3,max=100,message=("Field must be between 3 and 100 characters long")), DataRequired(message=("This field is required"))])
  qstring = StringField("Quote", validators =[Length(min=3,max=200,message=("Field must be between 3 and 200 characters long")), DataRequired(message=("This field is required"))])
  submit= SubmitField("Add Quote")

赋予视图功能:

    @app.route('/addquote/', methods=['GET', 'POST'])
def add_quote():
  form = QuoteForm()
  if request.method=='POST':
    quote = Quotes(quoteauthor=form.qauthor.data, quotestring= form.qstring.data)
    try:
      db.session.add(quote)
      db.session.commit()
    except Exception:
      db.session.rollback()
    return render_template("addquote_confirmation.html",form=QuoteForm())
  else:
    return render_template("addquote.html",form=QuoteForm())

if __name__=="__main__":
    app.run()

表单的 HTML 文件:

<form action = "on_validate()" method = "POST">
      {{ form.qauthor.label }} : {{ form.qauthor }} <br>
      {% for error in form.qauthor.errors %}
      <span style="color: red;">[{{ error }}]</span><br>
      {% endfor %} <br>
      {{ form.qstring.label }} : {{ form.qstring }} <br><br>
      {% for error in form.qstring.errors %}
      <span style="color: red;">[{{ error }}]</span><br>
      {% endfor %} <br>
      {{ form.submit }}
  </form>

运行测试用例时出现以下错误:AssertionError: b'[This field is required.]' not found in b'\n\n\n \n \n\n\n

一份报价已成功添加到数据库中。

\n\n要查看所有报价,请单击此处\n\n要转到主页,请单击主页 \n\n\n '

错误

标签: flask-wtformswtforms

解决方案


没有 on_validate()。在下面使用:

<form  method = "POST" novalidate>
      {{ form.qauthor.label }} : {{ form.qauthor }} <br>
      {% for error in form.qauthor.errors %}
      <span style="color: red;">[{{ error }}]</span><br>
      {% endfor %} <br>
      {{ form.qstring.label }} : {{ form.qstring }} <br><br>
      {% for error in form.qstring.errors %}
      <span style="color: red;">[{{ error }}]</span><br>
      {% endfor %} <br>
      {{ form.submit }}
  </form>

对于form.py

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, validators
from wtforms.validators import InputRequired, Length 

# Define QuoteForm below
class QuoteForm(FlaskForm):
  qauthor = StringField("Quote Author", validators =[Length(min=3,max=100,message=("Field must be between 3 and 100 characters long.")), InputRequired(message='This field is required.')])
  qstring = StringField("Quote", validators =[Length(min=3,max=200,message=("Field must be between 3 and 200 characters long.")), InputRequired(message='This field is required.')])
  submit= SubmitField("Add Quote")

和 routes.py

@app.route('/addquote/', methods=['GET', 'POST'])
def add_quote():
    form = QuoteForm()
    if form.validate_on_submit():
        if request.method=='POST':
            quote = Quotes(quoteauthor=form.qauthor.data, quotestring= form.qstring.data)
            try:
                db.session.add(quote)
                db.session.commit()
            except Exception:
                db.session.rollback()
            return render_template("addquote_confirmation.html",form=form)
        else:
            return render_template("addquote.html",form=form)
        return render_template("addquote_confirmation.html",form=form)
    else:
        return render_template("addquote.html",form=form)

推荐阅读