【问题标题】:Flask WTForm from list of field labels来自字段标签列表的烧瓶 WTForm
【发布时间】:2023-04-03 13:25:01
【问题描述】:

我正在尝试使用 Flask、WTForms 和 Jinja2 从给定的标签列表创建动态表单。 表单应包含每个给定标签的StringField。 我目前的方法是使用FieldList,如下面的代码所示。

我对这种方法的问题是,我无法区分每个请求字典中的键。

request.form 给了我这个 ImmutableMultiDict([('text', ''), ('text', ''), ('submit', 'submit')]) 与密钥重复。

我怎样才能知道哪个值输入了哪个StringField

理想情况下,request.form 应该是这样的ImmutableMultiDict([('field 1', ''), ('field 2', ''), ('submit', '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', ''), ('text', ''), ('submit', 'submit')])

【问题讨论】:

    标签: flask dynamic jinja2 flask-wtforms wtforms


    【解决方案1】:

    我只是忘了设置字段名: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')])

    【讨论】:

      猜你喜欢
      • 2019-07-19
      • 2016-12-26
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多