2015-02-06 26 views
5

Nie jestem do końca pewien, w jaki sposób podejście to dotyczy. Mam nadzieję, że się tam dostanę.Dodawaj dynamicznie pola wejściowe za pomocą wtapów

Na przykład mam tabelę pełną adresów na stronie. Liczba ta jest dynamiczna (może wynosić 5, 10 lub dowolną inną liczbę). I chcę możliwość ich edycji na jednej stronie.

My podejście do utworzenia kształtowego z wtforms zmienić jeden adres i mnożą go w jinja2 for loop i dołączania do propertys html name i id loop.index0 z itereation, aby można było wyodrębnić każdą wiersz danych ręcznie i umieść go w moim formularzu, kiedy chcę go ocenić.

Więc Formularz dla tego przykładu będzie:

class AdressForm(Form): 
    name = TextField() 

więc teraz mój szablon aproach wygląda następująco (rozbić na polu jeden wejściowego):

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

(forms.render_field jest tylko makro, aby określić odpowiednie klasy do funkcji pól wtątków, które są używane w wielu samouczkach)

To nie działa, ponieważ nie można przejść przez name parametr ręcznie do funkcji pola, ponieważ wtforms utworzyć name html-parametr z variblename w pierwszej formie.

Czy istnieje sposób na dodanie przedrostka lub przyrostka do nazwy formularza, który chcę renderować. A może to jest problem XY i moje podejście jest całkowicie błędne.

lub mają zrobić wszystko równina przez siebie (I naprawdę starają się unikać tego)

Odpowiedz

12

WTForms ma pole o nazwie meta-FormField a drugi meta-pole o nazwie FieldList. Te dwa połączone razem będzie Ci to, co chcesz:

class AddressEntryForm(Form): 
    name = TextField() 

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

Aby utworzyć wpisy w AddressesForm, wystarczy użyć listę słowników:

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

Następnie w szablonie, wystarczy pętli nad sub -forms:

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

WTForms automatycznie przedrostek nazwy i identyfikatory prawidłowo, więc kiedy piszesz dane z powrotem będziesz mógł po prostu form.addresses.data i wrócić listę słowniki ze zaktualizowanymi danymi.

+0

Thx, działa. Tylko nie z elementem formularza o nazwie "nazwa". Z niektórymi próbami i błędami 'address_entry_form.name' zawsze byłby poprzedzony prefiksem fieldname/id – muthan

+0

oh i z' type' tym samym problemem – muthan

+0

Czy istnieje sposób, aby to zaadaptować, aby móc dodawać pola za pomocą szablonów? Chciałbym umożliwić użytkownikowi kliknięcie przycisku + i dodanie innego pola do FieldList. –