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 %}
然后,在处理时测试表单名称
我在使 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 %}
然后,在处理时测试表单名称