Flask WTForms 如何 return 发布 FieldList 表单行数据

Flask WTForms How to return Posted FieldList form row data

我在使 WTF FieldList 提交 post 正确数据时遇到问题。我得到了一个自定义按钮名称 - 例如frmlist-1-delete 但其他 posted 数据总是来自添加的第一行。这是一个非常简单的例子:

# --- forms ------
class ItemForm(Form):
    username = wtf.StringField()
    delete = wtf.SubmitField('Delete')

class WrapperForm(Form):
    frmlist = wtf.FieldList(wtf.FormField(ItemForm))

# --Route--------
@bp.route("/test33", methods=["GET", "POST"])
@csrf.exempt
def test33():

    if request.method == 'POST':
         return redirect (url_for('sitetest.test33'))

    f1 = forms.ItemForm(username='One')
    f2 = forms.ItemForm(username='Two')
    f3 = forms.ItemForm(username='Three')
    wrapperform = forms.WrapperForm()
    wrapperform.frmlist.append_entry(f1)
    wrapperform.frmlist.append_entry(f2)
    wrapperform.frmlist.append_entry(f3)

    return render_template('/sitetest/test33.html', wrapperform=wrapperform)

# --   template---------
<!DOCTYPE html><html lang="en">
<head><meta charset="UTF-8"><title>Title</title></head>
<body>
<form action="" method="post" >
        {% for frm in wrapperform.frmlist %}
        {{ frm.username.data}} {{ frm.delete }}<br>
    {% endfor %}
</form>
</body></html>

以上呈现为:

但是,无论点击哪个删除按钮,request.formreturns第一个用户名'One'。这是使用 Pycharm 对第三行 post 的视图。请注意,返回了正确的 auto-generated 第三个按钮名称。

也出乎意料地 {{ frm.username }} 没有呈现值 & 我不得不添加 .data 来制作它有效。

知道如何取回正确的行数据以便删除它吗? 我真的不想写一个 hack 来解析按钮名称,然后以这种方式找到数据。

一个wtf.SubmitField属于表单,而不是一个单独的表单域,所以当你点击一个时,你只是发布表单。从你的描述中我不确定你想要完成什么,但你可能需要将每个包装在自己的表单标签中,例如:

{% for frm in wrapperform.frmlist %}
    <form action="" method="post" name="{{frm}}">       
        {{ frm.username.data}} {{ frm.delete }}
    </form><br>
{% endfor %}

然后,在处理时测试表单名称