2016-04-29 63 views
1

我已經看過文檔和其他一些Q/As在這裏,但我似乎無法讓代碼工作。我有一個forms.py文件的基本形式:將SelectMultipleField的動態數量添加到wtf-flask表格中

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) 

UPDATE: 要調用的形式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

基本上你正在試圖做的是追加到SimpleForm可變數量SelectMultipleField元素,每個都有不同的選擇。

首先,添加SelectMultipleField元素到原SimpleForm你應該繼承它(而不是原來的Form)當你定義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, ...) 

要呈現在模板中的動態表單,您將需要一個自定義的神社過濾器(退房this answer)也許更簡單的方法來渲染一個字段(如this page中所述)。

+0

我超級接近這....我怎麼實際上實現的意見頁面?我完全可以做{{for field in form}},但實體的實際名稱是什麼?以前,我會通過'form.category_4'調用,但是這裏有什麼是jinja的名字? –

+0

您使用flask-WTForms? – lesingerouge

+0

我輸入錯誤。我的意思是HTML頁面。例如,對於定義的表單,我會寫{{form.category_1}}。我如何爲名稱不同的動態字段做到這一點。 –