使用 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
我是 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