【问题标题】:WTForm FieldList of multiple SelectFields only sends the first one in requestWTForms 多个选择字段的字段列表仅发送请求中的第一个
【发布时间】:2019-08-19 19:30:27
【问题描述】:

我实现了 WTForm 的 FieldListSelectField 以根据 JSON 文件 (as stated in this answer) 中的数据呈现多个选择选项。它可以很好地显示选择选项,但是当我尝试通过SubmitField() 表单传递用户选择的所有值时,请求仅包含第一个值。

问题:如何从我的路线中访问多个 SelectField 中的所有选定值?

有趣的笔记:

  • 我对多个StringFields 执行了相同的FieldList 方法,并按照请求中的预期获取每个值。 (为什么SelectFields 会有所不同?)

多选字段:

  • 这里FordAssociateBucks 是来自选择字段的值。

请求响应:(来自request.form):

  • 注意如何只显示Ford。为什么不同时使用AssociateBucks
  • 注意所有文本字段如何正确显示

我的表单 (forms.py):

class SelectForm(FlaskForm):
    select = SelectField(choices=[]) #TODO testing without placeholder


class SelectFormList(FlaskForm):
    """A form that supports multiple select forms"""
    select_entries = FieldList(FormField(SelectForm))

我的模板 (home.html):

<form id="metadata_home_fom" action="{{ url_for('save_metadata') }}" method="POST">

    {% for select_form in select_metadata_form_list.select_entries %}
        {{ select_form.hidden_tag() }}
        {{ select_form.select.label }}: {{ select_form.select }}
    {% endfor %}

    {% for text_form in text_metadata_form.text_fields %}
        {{ text_form.hidden_tag() }}
        {{ text_form.text }}
    {% endfor %}
</form>


我的看法 (routes.py):

@app.route('/home', methods=['POST', 'GET'])
def home():
    select_metadata_form_list = SelectFormList()
    select_metadata_form_list.select_entries = get_select_entries()

        context = {"text_metadata_form": text_metadata_form,
        "select_metadata_form_list": select_metadata_form_list}

    return render_template('configuration.html', **context)

【问题讨论】:

    标签: python rest flask flask-wtforms wtforms


    【解决方案1】:

    问题是我在循环中创建表单而没有覆盖表单的 name,所以每个SelectFields 都具有相同的名称。

    快速修复只是在名称后附加一个唯一的 id:

            for k, v in select_dict.items():
                some_id = uuid.uuid1()
                select_entry = SelectForm()
                select_entry.select.name = f"select_entry-{some_id}" # each SelectForm() unique
                select_entry.select.label = k
                select_entry.select.choices = v
                all_select_items.append(select_entry)
    

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 2014-08-09
      • 1970-01-01
      • 2014-11-13
      • 2010-11-15
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多