2009-07-30 10 views
5

Mam formularz Django z kilkoma polami w nim jeden z których musi być powtórzony n razy (gdzie n nie jest znany w czasie projektowania), jak chciałbym o kodowaniu tego (jeśli to w ogóle możliwe)?Django - Powtórzenie pola formularza n razy w jednej formie

np. zamiast: -

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

muszę coś takiego: -

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

Dzięki,
Richard.

Odpowiedz

8

Można utworzyć powtarzające pól w metodzie formularza __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()) 

Więcej o dynamicznych formach można znaleźć, na przykład here

edit: aby odpowiedzieć na pytanie w komentarzu: wystarczy podać liczbę powtórzeń jako argument do metody __init__, coś takiego:

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

, a następnie w widoku (lub gdziekolwiek tworzyć formularz):

payments_form = PaymentsForm(10) 
+0

OK, które wygląda świetnie, w jaki sposób mogę przekazać wartość xrange (n) do klasy podczas tworzenia instancji formularza? - (Chyba muszę zdobyć trochę książek o pythonach)) – Frozenskys

+0

To działa, ale polecam podzielenie pola "n razy" na osobny obiekt Form i użycie Formformy, jak w odpowiedzi Daniela Rosemana. –

+0

Zrobiłem to w ten sposób kilkakrotnie :) – Jiaaro

4

Użyj formsets.

+2

Formularze powtarza model wiele razy, a nie pole. – priestc

+0

Jak by to działało, gdybym miał inne wartości w formie, które powinny być powtórzone tylko raz? Zmieniłem to pytanie, aby to pokazać. – Frozenskys

+0

+1 To jest czystsze rozwiązanie niż dodawanie dodatkowych pól w metodzie __init__. Pamiętaj, że formularz HTML nie musi być pojedynczym obiektem formularza Django, może to być wiele obiektów Form. W takim przypadku użyjesz jednego formularza dla wszystkich pól jednorazowych, a następnie innego formularza zawierającego powtarzające się pola - to drugi formularz, którego użyjesz w zestawie. Właśnie dlatego istnieją zestawy formularzy. –

Powiązane problemy