当 html 表单操作设置为 return 下一页时,wtf 表单验证停止工作

wtfform validation stops working when html form action set to return following page

我在两个包含 SelectField 和 StringField 的 wtform 组件中设置了 DataRequired 验证。

用户在index页面上输入的信息,然后打算携带到下面的results页面中。

index.html 文件中的 form action 属性设置为 "" 时,验证有效。但是,在这种情况下,输入的表单数据并没有存储在变量中并被传送到results(结果页面上的table字段显示"None")。

但是,当 index.html 中的 form action 属性设置为 results 时,输入的字段数据被存储并转移到结果页面,但不再进行 DataRequired 验证,大概是因为 html 动作属性绕过了 views.py 文件中的 if form.validate_on_submit()

这里有index.htmlforms.pyviews.py文件供参考。我怎样才能找到一种方法来进行验证并将输入的数据转移到结果页面?

views.py 文件:

####Index Page
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
        exception = ""
        try:
            connectToDB()
        except:
            exception = 'Failure to connect to db'
        form = StaffNames()
        if not exception:
                if form.validate_on_submit():
                        return redirect('/results')
        return render_template('index.html',title='Search Page',exception=exception,form=form)

#####Results Page
@app.route('/results', methods=['GET', 'POST'])
def results():
        form =StaffNames()
        return render_template('results.html',
                           title='Results', form=form, staff_name = dict(staff_choices).get(form.staff.data))

index.html:

<form action="" method="post" name="index">
        <p> {{ form.hidden_tag() }} </p>
        <p>{{ form.ranumber }} Enter RA Number</p>
        {% for error in form.ranumber.errors %}
         <span style="color: red;">[{{ error }}]</span>
          {% endfor %}<br>
        <p>{{ form.staff }} Select your name</p>
        {% for error in form.staff.errors %}
         <span style="color: red;">[{{ error }}]</span>
          {% endfor %}<br>

        <p><input type="submit" value="Search"></p>
    </form>

forms.py:

from flask_wtf import Form
from wtforms import StringField, SelectField
from wtforms.validators import DataRequired


staff_choices=[("", ""), ('1', 'John Jones'), ('2', 'Chris Hughes'), ('            3', 'Lyn Tony')]
class StaffNames(Form):
        ranumber = StringField('ranumber', validators=[DataRequired()])
        staff = SelectField('staff',choices=staff_choices,validators=[DataRequired()])

您是否尝试过将表单数据作为查询字符串传递?

####Index Page
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
        exception = ""
        try:
            connectToDB()
        except:
            exception = 'Failure to connect to db'

        form = StaffNames()
        if not exception:
            if form.validate_on_submit():
                query = {
                    'staff': form.staff.data,
                    'ranumber': form.ranumber.data
                }
                return redirect(url_for('results', **query))

        return render_template(
            'index.html', title='Search Page', exception=exception, form=form
        )


#####Results Page
from flask import request

@app.route('/results')
def results():
    ranumber = request.args.get('ranumber', None)
    staff = request.args.get('staff', None)

    return render_template(
        'results.html', title='Results', staff=staff, ranumber=ranumber
    )

这样你就可以完全跳过表单的 action 属性

<form method="post" name="index">
...
</form>