2009-07-30 12 views
5

Tengo un formulario Django con varios campos, uno de los cuales debe repetirse n veces (donde n no se conoce en el momento del diseño) cómo voy a codificar esto (si es posible en absoluto)?Django - Repetición de un campo de formulario n veces en un formulario

p. Ej. en lugar de: -

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()) 

necesito algo como: -

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

Gracias,
Richard.

Respuesta

8

Puede crear los campos repetidos en el método de su formulario __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()) 

más de los formularios dinámicos se puede encontrar, por ejemplo, here

de edición: para responder a la pregunta en su comentario: acaba de dar el número de repeticiones como un argumento para el método __init__, algo como esto:

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()) 

y luego en su opinión (o donde se crea el formulario):

payments_form = PaymentsForm(10) 
+0

OK que parece genial, ¿cómo podría pasar el valor de xrange (n) a la clase cuando creo una instancia del formulario? - (Supongo que necesito comprar algunos libros de pitón :)) – Frozenskys

+0

Esto funciona, pero recomiendo dividir el campo "n times" en un objeto Form separado y usar un Formset, como en la respuesta de Daniel Roseman. –

+0

Lo he hecho de esta manera en varias ocasiones :) – Jiaaro

4

Utilice formsets.

+2

formsets repite el modelo varias veces, no el campo. – priestc

+0

¿Cómo funcionaría si tuviera otros valores en la forma que solo deberían repetirse una vez? He editado la pregunta para mostrar esto. – Frozenskys

+0

+1 Esta es una solución más limpia que la adición de campos adicionales en el método __init__. Recuerde que un formulario HTML no necesita ser un solo objeto de formulario de Django, puede tratarse de muchos objetos de formulario. En este caso, usaría un Formulario para todos los campos de una sola vez y luego otro Formulario que contiene los campos repetidos; es el segundo Formulario que usaría en un Formulario. Esta es la razón por la cual existen los Formsets. –

Cuestiones relacionadas