Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django - Repeating a form field n times in one form

I have a Django form with several fields in it one of which needs to be repeated n times (where n is not known at design time) how would I go about coding this (if it is possible at all)?

e.g. instead of :-

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

I need something like :-

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

Thanks,
Richard.

like image 649
Frozenskys Avatar asked Jul 30 '09 10:07

Frozenskys


1 Answers

You can create the repeated fields in the __init__ method of your form:

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

More about dynamic forms can be found e.g. here

edit: to answer the question in your comment: just give the number of repetitions as an argument to the __init__ method, something like this:

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

and then in your view (or wherever you create the form):

payments_form = PaymentsForm(10)
like image 94
Benjamin Wohlwend Avatar answered Sep 20 '22 23:09

Benjamin Wohlwend