编辑。我原来的问题不够明确。我想允许用户将值传递到wtforms中的TextField,然后在添加它们之后显示它们输入的值。这将允许用户传递多个值,然后在最初输入的所有值上点击最终的“Sumbit”按钮。
我发现this question对输入的文字做了一些事情,这就是我尝试过的。
我的Python代码:
from flask import Flask, request, render_template, redirect
from wtforms import TextField, Form, SubmitField
def redirect_url(default='index'):
return request.args.get('next') or \
request.referrer or \
url_for(default)
class RegionForm(Form):
field = TextField('Region')
Submit = SubmitField('AddRegion')
fieldList = []
def main():
app = Flask(__name__)
@app.route('/region/', methods=['GET'])
def region():
form = RegionForm(request.form)
return render_template("region.html",
form=form)
@app.route('/add/', methods=['POST'])
def add():
request.form['fieldList'].append(request.form['field'])
return redirect(redirect_url())
app.run(debug=True)
我的HTML代码:
<form action="/add/" method="Post">
{% for field in form %}
<tr>
<th>{{ field.label }}</th>
<td>{{ field }}</td>
</tr>
{% endfor %}
</form>
{% for item in form.fieldList %}
{{ item }}
{% endfor %}
但是在我输入文本并单击“AddRegion”按钮后,我收到以下错误:The browser (or proxy) sent a request that this server could not understand.
但是,如果我注释掉行request.form['fieldList'].append(request.form['field'])
,则会发生重定向,但是文本尚未添加到表单上的隐藏列表中。如何将文本添加到列表中并将重定向返回到原始页面,以便用户可以添加更多文本?似乎只有这一行必须有错误,因为其余的工作正常。
如何允许用户动态地向字段添加文本,然后在浏览器中显示该字段? 然后,一旦添加了完整的区域字段,我希望以后能够检索该列表以在单独的函数中处理。
答案 0 :(得分:0)
第一部分
所以看完你的代码之后,我想我已经找到了你的问题。 Flask对其应用路线非常讲究。
您在烧瓶中的应用路线是:
@app.route('/add', methods=['POST'])
但是,您在表单上的当前操作是:
<form action="/add/" method="Post">
烧瓶/add
和/add/
实际上是两种不同的网络路径。因此,@app.route
未被触发。如果您将代码更改为:
`<form action="/add" method="post">`
你应该很高兴离开这里。
第二部分
我想我可能还有一个问题。因此,现在在您的HTML中,您实际上会关闭</form>
代码,然后再循环浏览fieldList
中的项目。
</form>
{% for item in form.fieldList %}
{{ item }}
{% endfor %}
尝试:
{% for item in form.fieldList %}
{{ item }}
{% endfor %}
</form>
我认为发生的事情是您的表单输入实际上并未放置在表单内部,因此当您尝试访问它们时,您会收到 KeyError 。
答案 1 :(得分:0)
我是科迪迈尔斯所说的第二个。但是,有一种简单的方法可以保证正确的路由,即使您以后更改它们:在您的表单中使用action="{{ url_for('region') }}"
,Flask会自动用正确的路由替换给定的函数名称。