2015-02-06 30 views
5

Non sono del tutto sicuro di come affrontare questo problema. Spero di arrivarci.Aggiungere campi di input dinamicamente con wtforms

Ad esempio, ho una tabella piena di indirizzi su una pagina. Il conteggio di questi è dinamico (potrebbe essere 5 o 10 o qualsiasi altro conteggio). E voglio la possibilità di modificarli su una pagina.

Il mio approccio è stato quello di creare un form con wtforms di modificare un indirizzo e moltiplicare in un Jinja2 for loop e aggiungere ai propertys html name e id il loop.index0 dalla itereation, in modo che io in grado di estrarre ogni riga di dati manualmente e rimetterlo nel mio modulo, quando voglio valutarlo.

così la forma di questo esempio potrebbe essere:

class AdressForm(Form): 
    name = TextField() 

così ora il mio modello aproach è simile al seguente (abbattere al campo di un ingresso):

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

(forms.render_field è solo una macro per specificare le classi giuste per la funzione di campo di wtforms come usano in molti tutorial)

Quindi questo non funziona, dal momento che non è possibile passare il name parametro manualmente per la funzione campo, dal momento che wtforms crea il parametro html name dal variblename del modulo iniziale.

Quindi c'è un modo per aggiungere un prefisso o suffisso al nome di un modulo che voglio rendere. O si tratta di un problema XY e il mio approccio è completamente sbagliato.

o hanno faccio tutto pianura da solo (io davvero cercare di evitare questo)

risposta

12

WTForms ha una meta-campo chiamato FormField e un altro meta-campo chiamato FieldList. Questi due combinati insieme si ottiene ciò che si vuole:

class AddressEntryForm(Form): 
    name = TextField() 

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

per creare voci nel AddressesForm, è sufficiente utilizzare un elenco di dizionari:

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

Poi, nel modello, è sufficiente un loop all'interno di sub -forme:

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

WTForms saranno prefisso automaticamente i nomi e gli ID in modo corretto, in modo che quando si registra nuovamente i dati che si sarà in grado di ottenere solo form.addresses.data e tornare un elenco di dizionari con i dati aggiornati.

+0

Thx, funziona. Solo non con un elemento del modulo chiamato 'name'. Con qualche tentativo e 'address_entry_form.name' sarebbe sempre dal prefisso del nome campo/id – muthan

+0

oh e con 'type' lo stesso problema – muthan

+0

C'è un modo per adattare questo in modo che possa aggiungere campi tramite i modelli? Vorrei consentire a un utente di fare clic su un pulsante + e aggiungere un altro campo a FieldList. –