使用 WTForms 创建 N 数量的表单

Creating an N-Amount of Forms using WTForms

我是 Flask 和 WTForms 的新手,在此先抱歉。

无论如何,我正在尝试使用下面在 forms.py

中定义的相同表单来创建多个表单
File_Choices = [('1', 'ex1.pdf'), ('2', 'ex2.pdf')
class Inputs(Form):
    Files = SelectField(u'File', choices=File_Choices,validators =[Required()])

我很熟悉这样一个事实,即我必须按照以下方式声明一些内容:form1=Inputs() 以在 views.py 中声明一个表单,但是当我需要声明一个未知的时,问题就出现了表格数量并跟踪所选值。

我的具体问题是我有一个包含 N 个元素的列表,每个元素都必须对应于用户从表单中选择的文件。所以我把我的问题分解为先创建 N 个表单,然后考虑使用这样的 for 循环:

for i in range(len(PDF_list))
    form'i'=Input()

因此,如果列表的长度为 5,则最终产品为 5 个声明为 form1、form2、form3、form4、form5 的输入表单。我知道这显然不能像我刚刚编码的那样工作,但这是我试图获得的功能,所以我仍然可以使用

之类的东西访问提交的值

dict(File_Choices).get(form'i'.Files.data).

可能有一个非常明显的方法来做到这一点,但是,我是使用 Flask 和 WTForms 的新手,所以如果你能一步一步地解释你在做什么,我将不胜感激,在你的解决方案中,因为我新的,那太棒了。

我相信你想要的是FieldList

所以你会有这样的东西:

from wtforms.fields import FieldList

file_choices = [('1', 'ex1.pdf'), ('2', 'ex2.pdf')
class Inputs(Form):
    files = FieldList(
        SelectField(u'File', choices=file_choices, validators =[Required()]),
        min_entries = N
    )

min_entries 指定表单中应显示多少 "SelectFields"。这样你就有了一个带有多个下拉 select 字段的表单,每个字段都有相同的 file_choices.

列表

在您的模板文件中,您可以像这样输出所有 select 字段(这将显示所有 N select 字段:

<html>
    <form action="" method=post>
        {{ form.files }}
        <input type="submit" />
    </form>
</html>

您还可以遍历 form.files 并分别设置每个 SelectField 的样式

现在,当您的表单发布后,您可以通过遍历 form.files 来访问每个 SelectField,如下所示:

for select_field in form.files:
    print(select_field.data)

您还可以使用索引访问 SelectField。要访问第三个 SelectField:

form.files[2].data

将 return“1”或“2”,具体取决于用户 select在哪个文件中编辑 SelectField