【问题标题】:Python iteration not capturing all data in WTForms data fields/fieldlistPython 迭代未捕获 WTForms 数据字段/字段列表中的所有数据
【发布时间】:2018-02-06 21:36:21
【问题描述】:

我试图简化我之前问过的一个问题。 我有一个 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('/test', methods=['GET', 'POST']) 定义测试():

    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('/test', methods=['GET', 'POST']) 定义测试():

    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)

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

【问题讨论】:

  • 查看我的更新答案。

标签: python dictionary flask wtforms


【解决方案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

【讨论】:

  • 您好,感谢您的回复。这似乎没有奏效。渲染字段没有问题 - 它们已经可见。一旦按下提交,问题就围绕数据展开——它似乎只提交第一个条目中的数据输入(即名称、开始和结束的第一个实例),而不是我输入到后续条目中的数据。
  • 试试这个:for entry in form.item_description().entries 并尝试打印,看看它会给你什么。我的意思是在你的/test 路线中。
  • 您好,我收到错误 AttributeError: 'HTMLString' object has no attribute 'entries' 当我添加这些括号时。
  • 我明白了,但是你也有这个 `{{ form.item_description() }}`。只是为了确定。
  • 是的,我在模板中也有。您认为“newdata = entry.data”适合存储所有条目还是只存储一个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2015-04-26
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多