Django - повторение поля формы n раз в одной форме - PullRequest
5 голосов
/ 30 июля 2009

У меня есть форма Django с несколькими полями в ней, одно из которых нужно повторить n раз (где n не известно во время разработки), как бы я пошел по поводу этого (если это вообще возможно)? *

например. вместо: -

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

Мне нужно что-то вроде: -

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

Спасибо
Ричард.

Ответы [ 2 ]

8 голосов
/ 30 июля 2009

Вы можете создать повторяющиеся поля в методе __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())

Подробнее о динамических формах можно узнать, например, здесь

edit: чтобы ответить на вопрос в вашем комментарии: просто укажите количество повторений в качестве аргумента метода __init__, примерно так:

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

, а затем по вашему мнению (или везде, где вы создаете форму):

payments_form = PaymentsForm(10)
4 голосов
/ 30 июля 2009

Использовать formsets .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...