Flask 添加所选多字段的动态编号';s至wtf烧瓶形式

Flask 添加所选多字段的动态编号';s至wtf烧瓶形式,flask,flask-wtforms,Flask,Flask Wtforms,我已经看过了文档和这里的几个其他Q/a,但我似乎无法使代码正常工作。我在forms.py文件中有一个基本表单: class SimpleForm(Form): list_of_files = ['Option 1','Option 2','Option 3','Option 4','Option 5','Option 6'] files = [(x, x) for x in list_of_files] acheckbox = MultiCheckboxField('La

我已经看过了文档和这里的几个其他Q/a,但我似乎无法使代码正常工作。我在forms.py文件中有一个基本表单:

class SimpleForm(Form):
    list_of_files = ['Option 1','Option 2','Option 3','Option 4','Option 5','Option 6']
    files = [(x, x) for x in list_of_files]
    acheckbox = MultiCheckboxField('Label',choices=files)
    third_list = ['Special Analysis']
    third_files = [(x, x) for x in third_list] 
    bcheckbox = MultiCheckboxField('Label', choices=third_files)
    category_1 = SelectField(u'', choices=())
    category_2 = SelectField(u'', choices=())
    category_3 = SelectField(u'', choices=())
(我稍后填充类别)。我还在views.py文件中调用此表单

form = SimpleForm()
我想动态添加几个SelectMultipleField(取决于用户上传的csv文件中的列数)。我想传递一个列名为n=1-5的列表变量(category),并用另一个列表(unique_值)生成许多字段,这些列表是该字段的值。我看了看医生,想说:

class F(Form):
    pass

    F.category = SelectMultipleField('category')
    for name in extra:
        setattr(F, name, SelectMultipleFields(name.title()))
    form = F(request.POST, ...)
我知道这不对。如何修改以将SelectMultipleField附加到原始“SimpleForm”中 我最终希望生成以下n个数字:

unique_values = [('1', 'Choice1'), ('2', 'Choice2'), ('3', 'Choice3')]
category_4 = SelectMultipleField(u"",choices=unique_values)
select_dict = {'Geography': ['US', 'Asia', 'Europe'], 'Product Type': ['X', 'Y', 'Z']}
form= F(request.form,select_dict)
更新: 要在views.py上调用表单,我使用以下命令:

unique_values = [('1', 'Choice1'), ('2', 'Choice2'), ('3', 'Choice3')]
category_4 = SelectMultipleField(u"",choices=unique_values)
select_dict = {'Geography': ['US', 'Asia', 'Europe'], 'Product Type': ['X', 'Y', 'Z']}
form= F(request.form,select_dict)
我的子类(在forms.py上)是:


我得到了以下错误:“formdata应该是一个支持“getlist”方法的multidict类型包装器”

基本上,您要做的是向
SimpleForm
追加一个数量可变的
SelectMultipleField
元素,每个元素都有不同的选择集

首先,要将
SelectMultipleField
元素添加到原始
SimpleForm
中,您应该在定义
F
时将其子类化(而不是原始
表单

其次,您可以使用已经编写的大部分代码,如下所示:

class F(SimpleForm):
    pass

#select_dict could be a dictionary that looks like this: {category_+str(col_number): set of choices}
for name,choices in select_dict.items():
    setattr(F, name, SelectMultipleFields(name.title(),choices=choices))

form = F(request.POST, ...)

要在模板中呈现动态表单,您需要一个自定义的Jinja过滤器(签出)和一种更简单的方式来呈现字段(如所述)。

我非常接近于此……如何在“视图”页面上实际实现?我当然可以做{{for form}字段,但是实体的实际名称是什么?以前,我会叫'form.category_4',但是这里的jinja名字是什么?你用的是表格吗?我打错了。我指的是html页面。例如,对于已定义的表单,我将编写{{form.category_1}。如何对名称不同的动态字段执行此操作。@Phillip在我的回答中提供了详细信息。当在forms.py页面上定义select_dict时,这项功能就可以正常工作了。试图从我的视图页面传递“select_dict”值…我做错了什么?