2009-07-30 6 views
5

Ho un modulo Django con diversi campi al suo interno uno dei quali deve essere ripetuto n volte (dove n non è noto in fase di progettazione) come farei per codificare questo (se è possibile a tutti)?Django - Ripetizione di un campo modulo n volte in un modulo

ad es. invece di: -

Class PaymentsForm(forms.form): 
    invoice = forms.CharField(widget=ValueHiddenInput()) 
    total = forms.CharField(widget=ValueHiddenInput()) 
    item_name_1 = forms.CharField(widget=ValueHiddenInput()) 
    item_name_2 = forms.CharField(widget=ValueHiddenInput()) 
    . 
    . 
    . 
    item_name_n = forms.CharField(widget=ValueHiddenInput()) 

ho bisogno di qualcosa di simile a: -

Class PaymentsForm(forms.form): 
    invoice = forms.CharField(widget=ValueHiddenInput()) 
    total = forms.CharField(widget=ValueHiddenInput()) 
    item_name[n] = forms.CharField(widget=ValueHiddenInput()) 

Grazie,
Richard.

risposta

8

È possibile creare i campi ripetuti nel metodo del modulo __init__:

class PaymentsForm(forms.Form): 
    invoice = forms.CharField(widget=forms.HiddenInput()) 
    total = forms.CharField(widget=forms.HiddenInput()) 

    def __init__(self, *args, **kwargs): 
     super(PaymentsForm, self).__init__(*args, **kwargs) 
     for i in xrange(10): 
      self.fields['item_name_%d' % i] = forms.CharField(widget=forms.HiddenInput()) 

più su forme dinamiche si possono trovare ad esempio here

edit: per rispondere alla domanda nel tuo commento: basta dare il numero di ripetizioni come argomento al metodo __init__, qualcosa di simile:

def __init__(self, repetitions, *args, **kwargs): 
     super(PaymentsForm, self).__init__(*args, **kwargs) 
     for i in xrange(repetitions): 
      self.fields['item_name_%d' % i] = forms.CharField(widget=forms.HiddenInput()) 

e quindi nella vista (o dovunque si crea il modulo):

payments_form = PaymentsForm(10) 
+0

OK che sembra interessante, come posso passare il valore xrange (n) alla classe quando creo un'istanza del modulo? - (Indovina che ho bisogno di procurarmi dei libri Python :)) – Frozenskys

+0

Funziona, ma ti consiglio di dividere il campo "n times" in un oggetto Form separato e usando un Formset, come nella risposta di Daniel Roseman. –

+0

L'ho fatto in questo modo in diverse occasioni :) – Jiaaro

4

Utilizzare formsets.

+2

Formset ripete il modello più volte, non il campo. – priestc

+0

Come funzionerebbe se avessi altri valori nella forma che dovrebbero essere ripetuti solo una volta? Ho modificato la domanda per mostrarlo. – Frozenskys

+0

+1 Questa è una soluzione più pulita rispetto all'aggiunta di campi aggiuntivi nel metodo __init__. Ricorda che un modulo HTML non ha bisogno di essere un singolo oggetto Django Form, può essere molti oggetti Form. In questo caso utilizzeresti un modulo per tutti i campi di sola andata e poi un altro modulo contenente i campi ripetuti: è il secondo modulo che utilizzeresti in un formset. Questo è il motivo per cui esistono Formset. –

Problemi correlati