出于简化交互的考虑,我们经常见到很多网站把登录页面和注册界面放在同一个页面上,而当我们使用Flask来实现时,却发现问题重重:
1、不管是哪个表单按下了提交按钮,总是提交第一个表单的数据;
2、当一个表单数据验证出错时,两个表单都出现了错误提示;
解决方法1:为你的不同表单里的SubmitField定义不同的名字,然后view.py中调用
....
form1 = Form1()
form2 = Form2()
....
if form1.submit1.data and form1.validate(): # 注意顺序
....
if form2.submit2.data and form2.validate(): # 注意顺序
....
更具体的说明在下面的文章写得非常清楚,认真看
https://zhuanlan.zhihu.com/p/23437362?refer=flask
解决方法2: 在模板中,每个表单提交请求通过action属性设置为不同的URL目标。
把视图函数分成 渲染包含表单的模板(GET请求)、处理表单请求(POST请求)的两部分。当处理多个表单时,把表单的渲染的任务在单独的视图函数中处理(视图A),每个单独的视图函数(视图B)处理表单提交的POST请求。如下:
模板:
<h3>Login Form</h3>
<form meghod="post" action="{{ url_for('handle_signin') }}">
{{ signin_form.csrf_token }}
{{ form_field(signin_form.username) }}
{{ form_field(signin_form.password) }}
{{ signin_form.submit }}
</form>
<h3>Register Form</h3>
<form method="post" action="{{ url_for('handle_register') }}">
{{ register_form.csrf_token }}
{{ form_field(register_form.username) }}
{{ form_field(register_form.email) }}
{{ form_field(register_form.password) }}
{{ register_form.submit }}
</form>
视图A:
@rouge('/multi-form-multi-view')
def multi_form_multi_view():
signin_form = SigninForm()
register_form = RegisterForm()
return render_template('2form2view.html', signin_form=signin_form, register_form=register_form)
负责单独处理POST提交的视图B:
@app.route('/handle-signin', methods=['POST']) # 仅传入POST到methods中
def handle_signin():
signin_form = SigninForm()
register_form = RegisterForm()
if signin_form.validate_on_submit():
username = signin_form.username.data
flash('%s , yoou just submit the Signin Form.' % username)
return redirect(url_for('index'))
return render_template('2form2view.html', signin_form = signin_form, register_form = register_form)
@app.route('/handle-register', methods=['POST'])
def handle_register():
signin_form = SigninForm()
register_form = RegisterForm()
if register_form.validate_on_submit():
username = register_form.username.data
flash('%s, you just submit the Register Form.' % username)
return redirect(url_for('index'))
return render_template('2form2view.html', signin_form = signin_form, register_form = register_form)
更清晰的介绍,参考看:https://www.cnblogs.com/xiaxiaoxu/p/10549571.html 下面的部分!