如何解决来自字段标签列表的 Flask WTForm
我正在尝试使用 Flask、WTForms 和 Jinja2 从给定的标签列表创建一个动态表单。
表单应包含每个给定标签的 StringField
。
我目前的方法是在下面的代码中使用 FieldList
。
我对这种方法的问题是,我无法区分每个请求字典中的键。
request.form
给了我这个 ImmutableMultiDict([('text',''),('text',('submit','submit')])
与关键重复。
如何找出哪个值输入到哪个 StringField
中?
理想情况下 request.form
应该看起来像这个 ImmutableMultiDict([('field 1',('field 2','submit')])
。
前端 (index.html)
<!DOCTYPE html>
<html>
<head>
<Meta charset="UTF-8">
</head>
<body>
<form action="" method="post">
{% for entry in form.entries %}
<p>{{entry.text.label}}: {{ entry.text }}</p>
{% endfor %}
<p>{{form.submit()}}</p>
</form>
</body>
</html>
后端
from wtforms import FieldList,FormField,StringField,SubmitField
from flask_wtf import FlaskForm
class TextForm(FlaskForm):
text = StringField('Placeholder')
class TextListForm(FlaskForm):
entries = FieldList(FormField(TextForm))
submit = SubmitField(u'submit')
from flask import Flask,render_template,request
app = Flask(__name__)
app.config.update(
SECRET_KEY = 'asdf',)
field_names = ["field 1","field 2"]
@app.route('/',methods=['POST','GET'])
def index():
fields = []
for name in field_names:
text_entry = TextForm()
text_entry.text.label = name
fields.append(text_entry)
form = TextListForm()
form.entries = fields
if form.is_submitted():
print(request.form)
return render_template('index.html',form=form)
if __name__ == '__main__':
app.run(debug=True)
输出:ImmutableMultiDict([('text','submit')])
解决方法
我刚刚忘记设置字段名称:text_entry.text.name = name
@app.route('/',methods=['POST','GET'])
def index():
fields = []
for name in field_names:
text_entry = TextForm()
text_entry.text.label = name
text_entry.text.name = name
fields.append(text_entry)
form = TextListForm()
form.entries = fields
if form.is_submitted():
print(request.form)
return render_template('index.html',form=form)
现在返回所需的字典:ImmutableMultiDict([('field 1',''),('field 2',('submit','submit')])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。