【问题标题】:Django - Repeating a form field n times in one formDjango - 在一个表单中重复一个表单域 n 次
【发布时间】:2009-07-30 10:00:57
【问题描述】:

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

谢谢,
理查德。

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    您可以在表单的__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

    编辑:回答您评论中的问题:只需将重复次数作为__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)
    

    【讨论】:

    • 好吧,看起来很酷,当我创建表单实例时,如何将 xrange(n) 值传递给类? - (我想我需要给自己买一些 Python 书籍 :))
    • 这可行,但我建议将“n 次”字段拆分为单独的 Form 对象并使用 Formset,如 Daniel Roseman 的回答。
    【解决方案2】:

    使用formsets

    【讨论】:

    • formsets 重复模型多次,而不是字段。
    • 如果表单中有其他值只能重复一次,这将如何工作?我已经编辑了问题以显示这一点。
    • +1 这比在 init 方法中添加额外字段更简洁。请记住,HTML 表单不需要是单个 Django Form 对象,它可以是多个 Form 对象。在这种情况下,您将对所有一次性字段使用一个表单,然后使用另一个包含重复字段的表单 - 这是您将在 Formset 中使用的第二个表单。这就是表单集存在的原因。
    • @priestc 表单集不需要保存到模型中。他们可以轻松地将数据作为字典列表传递。
    • 这只是一个简短的链接答案,无法解释为什么这更好。
    猜你喜欢
    • 2020-07-09
    • 2022-08-02
    • 1970-01-01
    • 2015-06-09
    • 2017-12-24
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多