2010-03-10 15 views
8

Sto cercando di automatizzare la creazione di qualcosa di simile:Django: creare array di input HTML utilizzando una forma Django

<input type='text' name='asdf[]' /> 
<input type='text' name='asdf[]' /> 
<input type='text' name='asdf[]' /> 

In bicicletta attraverso una gamma in forma. Ho provato cose come questa, insieme a diverse altre varianti:

# in a model class 
for i in range(1, prim+1): 
    self.fields['asdf'] = forms.CharField(label=i) 

# in the template 
<form action='#' method='post'> 
    {{form.as_p}} 
</form> 

Ma non ho avuto fortuna però.

Come posso automatizzare una serie di ingressi?

** Modifica ** Per chiarire, alla fine ho bisogno di essere in grado di accedere ai campi nel modello come questo:

{% for input in form.fields.asdf %} 
{{input}} 
{% endfor %} 

che poi si spera me ottenere la lista di input originale mostrata sopra .. .

+0

Il loop sta creando un nuovo CharField con un'etichetta non valida (non può essere un numero intero) e sovrascrive self.field ['asdf']. Non sono sicuro di cosa stia cercando di fare. Intendi come usare l'attributo choice? –

+0

Sì, quella versione particolare di esso appena sovrascrive. Ho avuto un codice più complicato prima di provare a creare elenchi e/o dizionari, ma non sono riuscito a farli funzionare. – Brant

+0

Forse potresti rendere l'etichetta 'asdf' o qualcosa del genere, quindi eseguire il ciclo di tutti i campi, eseguendo l'output se '{% ifequal field.label 'asdf'%}' corrisponde, quindi usa 'forloop.counter' per mostrare 1, 2 , 3, ecc. Ho aggiornato la mia risposta qui sotto. –

risposta

1

dovrebbe essere più come ad esempio:

# in a model class 
for i in range(1, prim+1): 
    self.fields['asdf_%s' % i] = forms.CharField(label='Label %i' % i) 

Ma molto dipende da ciò che si vuole raggiungere.

+0

Non desidero che i campi abbiano nomi diversi quando vengono emessi. – Brant

+1

C'è un motivo particolare per cui non vuoi nomi di campi diversi? Solo curioso. –

+0

@Brant: ovviamente un dizionario non può contenere più di un valore per una chiave.Nel tuo codice stai semplicemente scavalcando il campo ancora e ancora. –

7

Jacob Kaplan-Moss (co-autore di Django) ha recentemente pubblicato un grande articolo per la gestione di forme dinamiche, che dovrebbe risolvere il problema in un modo preferito: http://jacobian.org/writing/dynamic-form-generation/

Sta usando lo stesso metodo che Felix suggerisce, ma vale la pena leggere l'intero articolo per capire meglio il concetto.

Utilizzare la tecnica asdf[] è sciatta, perché in questo caso è necessario occuparsi dell'ordine. Non è anche la pratica standard.

Edit:

Per gestire la situazione in cui è necessario rilevare quando si colpisce questi campi dinamici:

{% for input in form.fields %} 
    {% ifequal input.label 'asdf' %} 
     {{ forloop.counter }}: {{input}}<br /> 
    {% endifequal %} 
{% endfor %} 
+0

Questo è il modo in cui originariamente avevo impostato le cose. Purtroppo, non soddisfa le mie esigenze. C'è un paragrafo di testo di descrizione che devo inserire prima che gli input di asdf [] inizino ... e il numero di input di asdf [] deve essere dinamico. Quindi, devo essere in grado di rilevare che gli input Asdf stanno per iniziare, visualizzare un paragrafo, quindi sputarli tutti. – Brant

+1

+1 Bel articolo a cui sei collegato. –

+0

Riassunto dell'articolo: lascia che la tua classe Form faccia il lavoro pesante. Ottima lettura. – Seth