多个selectfield的WTForm FieldList只发送请求中的第一个字段

2024-10-05 15:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我用SelectField实现了WTForm的FieldList,以基于JSON文件(as stated in this answer)中的数据呈现多个select选项。它可以很好地显示select选项,但是当我试图通过SubmitField()表单传递用户选择的所有值时,请求只包含第一个表单中的值。你知道吗

问题:如何从路由中的多个SelectFields访问所有选定值?

有趣的注意:

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

多个选择字段:enter image description here

  • 这里FordAssociateBucks是选择字段中的值。你知道吗

请求-响应:(来自request.form):enter image description here

  • 注意如何只显示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)

Tags: textinform表单homefor选项select
1条回答
网友
1楼 · 发布于 2024-10-05 15:21:29

问题是我在循环中创建表单时没有重写表单的 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)

相关问题 更多 >