Django - Repeating a form field n times in one form

django, django-forms, python

Solution

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)

Problem

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.

Original source