2015-02-06 84 views
5

我不太確定如何處理此問題。我希望我能到達那裏。使用wtforms動態添加輸入字段

例如我有一張桌子上充滿了地址。這些計數是動態的(可以是5或10或其他計數)。我希望能夠在一個頁面上編輯它們。

我的方法是創建wtforms表單編輯一個地址和繁殖 它在Jinja2的for loop並追加到HTML propertys nameidloop.index0從itereation,這樣我就可以提取數據的每一行手動 並將其放回到我的表單中,當我想評估它時。

所以這個例子的形式是:

class AdressForm(Form): 
    name = TextField() 

所以現在我的模板的形式給出瞭如下所示(分解到一個輸入字段):

{% for address in addresses %} 
    {{ forms.render_field(addressform.name, id = "name_" ~ loop.index0, 
          name = "name_" ~ loop.index0, value = address.name) }} 
{% endfor %} 

(forms.render_field是隻是一個宏,指定wtforms字段函數的正確類,就像他們在許多教程中使用的那樣)

所以這是行不通的,因爲你不能通過name參數手動添加到字段函數中,因爲wtforms從初始表單的variblename創建name html-paramter。

那麼有沒有一種方法可以將前綴或後綴添加到我想呈現的表單的名稱。 或者這是一個XY-問題,我的方法是完全錯誤的。

或者我做這一切平原自己(我真的盡力避免這種情況)

回答

12

WTForms有薈萃場稱爲FormField和另一間名爲場FieldList。這兩個結合在一起會得到你想要的東西:

class AddressEntryForm(Form): 
    name = TextField() 

class AddressesForm(Form): 
    """A form for one or more addresses""" 
    addresses = FieldList(FormField(AddressEntryForm), min_entries=1) 

要在AddressesForm創建條目,只需使用詞典列表:

user_addresses = [{"name": "First Address"}, 
        {"name": "Second Address"}] 
form = AddressesForm(addresses=user_addresses) 
return render_template("edit.html", form=form) 

然後,在你的模板,只需遍歷所有的子-forms:

{% for address_entry_form in form.addresses %} 
    {{ forms.render_field(address_entry_form.name) }} 
{% endfor %} 

WTForms會自動前綴名稱和的ID正確,這樣當您發佈的數據備份,你將能夠只得到form.addresses.data並取回名單包含更新數據的字典。

+0

Thx,它的工作。只是沒有名稱爲'name'的表單元素。有一些嘗試和錯誤'address_entry_form.name'將始終由字段名稱/編號 – muthan 2015-02-07 12:36:54

+0

的前綴哦和'類型'相同的問題 – muthan 2015-02-07 13:03:32

+0

有沒有一種方法來適應這種情況,以便我可以通過模板添加字段?我想讓用戶點擊一個+按鈕,並將另一個字段添加到FieldList中。 – 2017-10-09 06:03:03