代码之家  ›  专栏  ›  技术社区  ›  Frozenskys

django-在一个表单中重复表单域n次

  •  5
  • Frozenskys  · 技术社区  · 15 年前

    我有一个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 回复  |  直到 15 年前
        1
  •  8
  •   Benjamin Wohlwend    15 年前

    您可以在 __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())
    

    有关动态形式的更多信息,如 here

    编辑:回答您评论中的问题:只需将重复次数作为参数提供给 爱因斯坦 方法,类似于:

        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)
    
        2
  •  5
  •   Daniel Roseman    15 年前

    使用 formsets .