我怎样才能添加一份表格的多份副本并用不同的数据提交它们?烧瓶,WTForms
How can i add several copies of one form and submit them with different data? Flask, WTForms
你好。我有一个文档数据库和 Flask 应用程序,让我有机会通过网络查看数据库的文档,添加和删除它们。每个文档只有它的编号和名称。
通常我会一个一个地添加文件,因为我有 WTForm -
class addDocForm(FlaskForm):
doc_name = StringField('Название документа', validators=[DataRequired()])
doc_number = StringField('Исходящий номер', validators=[DataRequired()])
.html代码-
<form action="" method="post" >
{{ form.hidden_tag() }}
<div class="row">
<label>{{ form.doc_name.label }}</label>
{{ form.doc_name(size=32) }}
</div>
<div class="row">
<label>{{ form.doc_number.label }}</label>
{{ form.doc_number(size=32) }}
</div>
<div class="row">
<button type="submit">Добавить</button>
</div>
</form>
和一些/路由逻辑 -
@app.route('/add_doc', methods=['GET', 'POST'])
@login_required
def add_doc():
form = addDocForm()
if form.validate_on_submit():
doc = Doc(doc_name=form.doc_name)
if Doc.query.filter_by(doc_name=form.doc_name.data).first() == None:
db.session.add(doc)
db.session.commit()
所以我把每份文件都一个一个的填上这张表,一遍又一遍的提交。现在我已经累了。我想通过减少提交按钮的点击次数来节省精力。当然这是个玩笑,但问题真的是这样的:
如何在一页上添加此 'addDocForm' 的多个副本,填写这些副本的字段并单击提交一次?
有什么巧妙的方法吗?例如,我想一次添加 5-7 个文档,而无需一个一个地添加。假设我已经用我的表单(一个表单)加载页面填写字段,然后单击“+”按钮并出现另一个表单..再次填写字段->“+”按钮..。完成后点击'submit'按钮,所有填写字段的数据轮流进入数据库。这是真的吗?有任何想法吗? p.s。我有一个关于如何使用 clear sql + html + js 实现它的想法,没有 flask-wtforms,sqalchemy 等等。但我想这是错误的方法,因为我的应用程序已经有一半了使用它们编写的。 )这么多文字,不确定是否有人达到这一点..但仍然 - 请帮助我(((((
您可以使用 field enclosures 构造一个 MegaForm
。
例如(未经测试):
from wtforms import StringField, FormField, FieldList
class AddDocForm(FlaskForm):
doc_name = StringField('Название документа', validators=[DataRequired()])
doc_number = StringField('Исходящий номер', validators=[DataRequired()])
class MegaForm(FlaskForm):
documents = FieldList(FormField(AddDocForm), min_entries=7, max_entries=7)
@app.route('/add_doc', methods=['GET', 'POST'])
@login_required
def add_doc():
form = AddDocForm()
if form.validate_on_submit():
for idx, data in enumerate(form.documents.data):
doc = Doc(doc_name=data["doc_name"])
if Doc.query.filter_by(doc_name=data["doc_name"]).first() == None:
db.session.add(doc)
db.session.commit()
你好。我有一个文档数据库和 Flask 应用程序,让我有机会通过网络查看数据库的文档,添加和删除它们。每个文档只有它的编号和名称。
通常我会一个一个地添加文件,因为我有 WTForm -
class addDocForm(FlaskForm):
doc_name = StringField('Название документа', validators=[DataRequired()])
doc_number = StringField('Исходящий номер', validators=[DataRequired()])
.html代码-
<form action="" method="post" >
{{ form.hidden_tag() }}
<div class="row">
<label>{{ form.doc_name.label }}</label>
{{ form.doc_name(size=32) }}
</div>
<div class="row">
<label>{{ form.doc_number.label }}</label>
{{ form.doc_number(size=32) }}
</div>
<div class="row">
<button type="submit">Добавить</button>
</div>
</form>
和一些/路由逻辑 -
@app.route('/add_doc', methods=['GET', 'POST'])
@login_required
def add_doc():
form = addDocForm()
if form.validate_on_submit():
doc = Doc(doc_name=form.doc_name)
if Doc.query.filter_by(doc_name=form.doc_name.data).first() == None:
db.session.add(doc)
db.session.commit()
所以我把每份文件都一个一个的填上这张表,一遍又一遍的提交。现在我已经累了。我想通过减少提交按钮的点击次数来节省精力。当然这是个玩笑,但问题真的是这样的:
如何在一页上添加此 'addDocForm' 的多个副本,填写这些副本的字段并单击提交一次?
有什么巧妙的方法吗?例如,我想一次添加 5-7 个文档,而无需一个一个地添加。假设我已经用我的表单(一个表单)加载页面填写字段,然后单击“+”按钮并出现另一个表单..再次填写字段->“+”按钮..。完成后点击'submit'按钮,所有填写字段的数据轮流进入数据库。这是真的吗?有任何想法吗? p.s。我有一个关于如何使用 clear sql + html + js 实现它的想法,没有 flask-wtforms,sqalchemy 等等。但我想这是错误的方法,因为我的应用程序已经有一半了使用它们编写的。 )这么多文字,不确定是否有人达到这一点..但仍然 - 请帮助我(((((
您可以使用 field enclosures 构造一个 MegaForm
。
例如(未经测试):
from wtforms import StringField, FormField, FieldList
class AddDocForm(FlaskForm):
doc_name = StringField('Название документа', validators=[DataRequired()])
doc_number = StringField('Исходящий номер', validators=[DataRequired()])
class MegaForm(FlaskForm):
documents = FieldList(FormField(AddDocForm), min_entries=7, max_entries=7)
@app.route('/add_doc', methods=['GET', 'POST'])
@login_required
def add_doc():
form = AddDocForm()
if form.validate_on_submit():
for idx, data in enumerate(form.documents.data):
doc = Doc(doc_name=data["doc_name"])
if Doc.query.filter_by(doc_name=data["doc_name"]).first() == None:
db.session.add(doc)
db.session.commit()