将动态数量的SelectMultipleField添加到wtf-flask表单中

时间:2016-04-29 20:13:19

标签: flask flask-wtforms

我在这里查看了文档和其他几个问答,但我似乎无法使代码工作。我在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列的名称,并使用另一个列表(unique_values)生成那么多字段,这些列表是该字段的值。我正在查看文档并试图想出这个:

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)

更新: 要在 views.py 上调用该表单,请使用以下命令:

select_dict = {'Geography': ['US', 'Asia', 'Europe'], 'Product Type': ['X', 'Y', 'Z']}
form= F(request.form,select_dict)

我的子类(在 forms.py 上)是:

class F(SimpleForm):
pass
#select_dict could be a dictionary that looks like this: {category_+str(col_number): set of choices}
def __init__(self, select_dict, *args, **kwargs):
    super(SimpleForm, self).__init__(*args, **kwargs)
    print(select_dict)
    for name,choices in select_dict.items():
        test = [(x, x) for x in choices]
        setattr(F, name, SelectMultipleField(name.title(),choices=test))

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

1 个答案:

答案 0 :(得分:1)

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

首先,要将SelectMultipleField元素添加到原始SimpleForm,您应该在定义Form时将其子类化(而不是原始的F。< / p>

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

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过滤器(请查看this answer),这可能是一种更简单的呈现字段的方法(如this page所述)。