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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With