flask wtforms,按下什么输入
flask wtforms, what input is pressed
这里是 Flask 初学者,请多多包涵!
在我针对问题简化的这一小段代码中,我有一个定义的路由/具有 2 种形式:我想要添加形式向数据库添加内容,删除形式删除内容,简单.
但是我的问题是,在这段代码中,我无法区分按下表单中的哪个输入按钮,因为 formadd.validate() 和 formdel.validate() 都总是 return true .
如何区分按下了哪个提交按钮以便相应地操作数据库?
一开始我写的是下面目前评论的内容,但是显然它不起作用,因为验证方法returns true....
from flask import Flask, render_template, request
from flask.ext.sqlalchemy import SQLAlchemy
from wtforms import Form, StringField
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///botdb.db'
db = SQLAlchemy(app)
class BotFormAdd(Form):
botname = StringField('bot name')
botdescription = StringField('bot description')
class BotFormDelete(Form):
botid = StringField('bot id')
@app.route('/', methods=['GET', 'POST'])
def index():
formadd = BotFormAdd(request.form)
formdel = BotFormDelete(request.form)
if request.method == 'POST':
print(formadd.validate(), formdel.validate())
# if request.method == 'POST' and formadd.validate():
# print('in formadd')
# bot = Bot(name=formadd.botname.data, description=formadd.botdescription.data)
# db.session.add(bot)
# db.session.commit()
# return redirect(url_for('index'))
# if request.method == 'POST' and formdel.validate():
# print('in formdel')
# db.session.delete(formdel.botid.data)
# db.session.commit()
# return redirect(url_for('index'))
return render_template('index.html', title='Home', formadd=formadd, formdel=formdel)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>this is a test</title>
</head>
<body>
<form method=post action="/">
<dl>
{{ formadd.botname }}
{{ formadd.botdescription }}
</dl>
<p><input type=submit name='add' value='add this'>
</form>
<form method=post action="/">
<dl>
{{ formdel.botid }}
</dl>
<p><input type=submit name='delete' value='delete this'>
</form>
</body>
</html>
有很多方法可以做到这一点,但它分为两类——您可以通过路由来指示它,也可以通过表单上的元素来指示它。
大多数人只会添加单独的路线:
@app.route('/delete-bot/', methods=['post'])
def delete_bot():
form = BotFormDelete()
if form.validate():
delete_bot(id=form.botid.data)
flash('Bot is GONE')
return redirect(url_for('index'))
因此您的删除表单将提交到该路由,得到处理并发送回索引。
<form method='post' action='url_for('delete_bot')>
而且您可以通过不同的方式添加机器人。
或者,您可以从它的内容中检查它是什么类型的表单。例如
if request.form.get('botid'):
# it has a botid field, it must be a deletion request
form = BotFormDelete()
form.validate()
delete_bot(form.botid.data)
else:
form = BotFormAdd()
....
但是那样的话好像很快就会变得乱七八糟。
这里是 Flask 初学者,请多多包涵!
在我针对问题简化的这一小段代码中,我有一个定义的路由/具有 2 种形式:我想要添加形式向数据库添加内容,删除形式删除内容,简单.
但是我的问题是,在这段代码中,我无法区分按下表单中的哪个输入按钮,因为 formadd.validate() 和 formdel.validate() 都总是 return true .
如何区分按下了哪个提交按钮以便相应地操作数据库?
一开始我写的是下面目前评论的内容,但是显然它不起作用,因为验证方法returns true....
from flask import Flask, render_template, request
from flask.ext.sqlalchemy import SQLAlchemy
from wtforms import Form, StringField
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///botdb.db'
db = SQLAlchemy(app)
class BotFormAdd(Form):
botname = StringField('bot name')
botdescription = StringField('bot description')
class BotFormDelete(Form):
botid = StringField('bot id')
@app.route('/', methods=['GET', 'POST'])
def index():
formadd = BotFormAdd(request.form)
formdel = BotFormDelete(request.form)
if request.method == 'POST':
print(formadd.validate(), formdel.validate())
# if request.method == 'POST' and formadd.validate():
# print('in formadd')
# bot = Bot(name=formadd.botname.data, description=formadd.botdescription.data)
# db.session.add(bot)
# db.session.commit()
# return redirect(url_for('index'))
# if request.method == 'POST' and formdel.validate():
# print('in formdel')
# db.session.delete(formdel.botid.data)
# db.session.commit()
# return redirect(url_for('index'))
return render_template('index.html', title='Home', formadd=formadd, formdel=formdel)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>this is a test</title>
</head>
<body>
<form method=post action="/">
<dl>
{{ formadd.botname }}
{{ formadd.botdescription }}
</dl>
<p><input type=submit name='add' value='add this'>
</form>
<form method=post action="/">
<dl>
{{ formdel.botid }}
</dl>
<p><input type=submit name='delete' value='delete this'>
</form>
</body>
</html>
有很多方法可以做到这一点,但它分为两类——您可以通过路由来指示它,也可以通过表单上的元素来指示它。
大多数人只会添加单独的路线:
@app.route('/delete-bot/', methods=['post'])
def delete_bot():
form = BotFormDelete()
if form.validate():
delete_bot(id=form.botid.data)
flash('Bot is GONE')
return redirect(url_for('index'))
因此您的删除表单将提交到该路由,得到处理并发送回索引。
<form method='post' action='url_for('delete_bot')>
而且您可以通过不同的方式添加机器人。
或者,您可以从它的内容中检查它是什么类型的表单。例如
if request.form.get('botid'):
# it has a botid field, it must be a deletion request
form = BotFormDelete()
form.validate()
delete_bot(form.botid.data)
else:
form = BotFormAdd()
....
但是那样的话好像很快就会变得乱七八糟。