当 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.html
、forms.py
和views.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>
我在两个包含 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.html
、forms.py
和views.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>