Django - 在一个表单中重复n次字段

6 投票
2 回答
5131 浏览
提问于 2025-04-15 13:16

我有一个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())

谢谢,
Richard.

2 个回答

4

使用表单集合

10

你可以在表单的 __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())

关于动态表单的更多信息可以在这里找到,比如 这里

补充一下,针对你评论中的问题:只需将重复的次数作为参数传递给 __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)

撰写回答