Flask一个页面多个form提交的问题及解决方法

出于简化交互的考虑,我们经常见到很多网站把登录页面和注册界面放在同一个页面上,而当我们使用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 下面的部分!

好的,以下是一个简单的 Flask 登录注册页面的示例代码: ```python from flask import Flask, render_template, request, redirect, url_for app = Flask(__name__) users = [] @app.route('/') def index(): return render_template('index.html') @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] users.append({'username': username, 'password': password}) return redirect(url_for('login')) return render_template('register.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] for user in users: if user['username'] == username and user['password'] == password: return 'Welcome, {}!'.format(username) return 'Invalid username or password' return render_template('login.html') if __name__ == '__main__': app.run(debug=True) ``` 这个示例代码包含了三个路由:`/`、`/register` 和 `/login`。`/` 路由返回一个简单的欢迎页面,`/register` 路由处理用户注册,`/login` 路由处理用户登录。 在 `/register` 路由中,我们使用了 POST 方法提交表单数据,将用户名和密码添加到 `users` 列表中,并重定向到 `/login` 路由。 在 `/login` 路由中,我们同样使用了 POST 方法提交表单数据,然后遍历 `users` 列表,检查用户名和密码是否匹配。如果匹配,返回欢迎页面,否则返回错误信息。 你可以根据自己的需求修改这个示例代码,比如添加更多的字段、使用数据库存储用户信息等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值