我怎样才能添加一份表格的多份副本并用不同的数据提交它们?烧瓶,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()