Python迭代不捕获WTForms数据字段/ fieldlist中的所有数据

时间:2017-08-29 12:16:01

标签: python dictionary flask wtforms

我试图简化之前提出的问题。 我有一个FieldList表单:

class TrackForm(Form):
    name = TextField('name')
    start = StringField('Start Time')
    end = StringField('End Time')
class Merge(Form):
    item_description = FieldList(FormField(TrackForm), min_entries=2, max_entries=6)

我在测试模板中调用表单,并在提交之前填写多个条目的字段。

<form method="POST" >
  {{ form.hidden_tag() }}

{{ form.item_description }}

<input class="btn btn-primary" style="margin-left:300px;"type="submit" value="Submit" />
</form>

我使用以下内容迭代条目,并希望将所有条目存储在变量“newdata”中。

@app.route('/test', methods=['GET', 'POST'])
def test():

        form=Merge()
        if form.validate_on_submit():
                for entry in form.item_description.entries:
                        newdata = entry.data
                        return redirect(url_for('test1', newdata=newdata))
        return render_template(
        'test.html', title='test', form=form)



@app.route('/test1', methods=['GET', 'POST'])
def test1():
        newdata=request.args.get('newdata', '')
        return render_template(
        'test1.html', title='test1', newdata=newdata)

在test1.html模板中,我只是简单地调用newdata:

{{ newdata }}

它仅显示表格第一个输入行的数据,而不显示其他行。你能明白我为什么只能抓住表格中的第一个条目吗?

更新

当我在验证表单后尝试打印数据时,似乎表单中的数据包含输入到表单中的所有数据:

@ app.route(&#39; / test&#39;,methods = [&#39; GET&#39;,&#39; POST&#39;]) def test():

    form=Merge1()
    #item_description = form.item_description.data or ''
    if form.validate_on_submit():
            print (form.item_description.data)
            for entry in form.item_description.entries:
                    newdata = entry.data
                    return redirect(url_for('test1', newdata=newdata))
    return render_template(
    'test.html', title='test', form=form)

^这表明表单条目能够存储数据。然而.....

当我在验证表单后尝试打印条目时,不会打印任何内容:

@ app.route(&#39; / test&#39;,methods = [&#39; GET&#39;,&#39; POST&#39;]) def test():

    form=Merge1()
    #item_description = form.item_description.data or ''
    if form.validate_on_submit():
            print (form.item_description.entries)
            for entry in form.item_description.entries:
                    newdata = entry.data
                    return redirect(url_for('test1', newdata=newdata))
    return render_template(
    'test.html', title='test', form=form)

如何使用它来创建包含所有数据的字典?

1 个答案:

答案 0 :(得分:1)

您还需要在模板中呈现TrackForm类字段。这意味着调用description()而不是description

<form method="POST" >
    {{ form.hidden_tag() }}
    {{ form.item_description() }}
  <input class="btn btn-primary" style="margin-left:300px;"type="submit" value="Submit" />

而不是这样做:

for entry in form.item_description.entries:
                        newdata = entry.data

您可以改为使用dict

form=Merge()
    if form.validate_on_submit():
            newdata = {}
            for entry in form.item_description.entries:
                    newdata[entry] = entry.data