将数据从文本框传递到wtform&在浏览器中显示

时间:2017-02-02 21:23:37

标签: python html flask wtforms

编辑。我原来的问题不够明确。我想允许用户将值传递到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']),则会发生重定向,但是文本尚未添加到表单上的隐藏列表中。如何文本添加到列表中并将重定向返回到原始页面,以便用户可以添加更多文本?似乎只有这一行必须有错误,因为其余的工作正常。

如何允许用户动态地向字段添加文本,然后在浏览器中显示该字段? 然后,一旦添加了完整的区域字段,我希望以后能够检索该列表以在单独的函数中处理。

2 个答案:

答案 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会自动用正确的路由替换给定的函数名称。