【问题标题】:Django: how do I include the same field multiple times in a Django form?Django:如何在 Django 表单中多次包含相同的字段?
【发布时间】:2011-11-07 22:46:03
【问题描述】:

我的 Django 应用中有一个基本的好友邀请表单,如下所示:

class FriendInviteForm(forms.Form):
    email = forms.EmailField()

当用户邀请一个人时,它可以完美运行,但我希望允许用户邀请尽可能多的朋友。我正在尝试构建的实现是显示带有 3 个电子邮件字段的表单,并允许用户使用 jQuery 在客户端动态添加更多字段。

处理创建此类表单的最佳方法是什么,我将如何处理我视图中的电子邮件字段?我还可以为此使用 Django 的内置表单吗?

谢谢!

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    为什么不使用上面提到的 Django formsets?您可以像这样定义额外的电子邮件字段:

    email_formset = formset_factory(EmailForm, extra=2)
    group_name_form = GroupNameForm()  # Additional form for usefull data.
    

    然后在你的模板中使用它的附加形式:

    <form action="" method="post">
        {% csrf_token %}
    
        {{ group_name_form.as_p }}
    
        {{ email_formset.as_p }}
    
        <input type="submit" value="Send Invites"> <!-- Single Submit button -->
    </form>
    

    最后,在您的 views.py 中,您可以处理两种形式,例如:

    def view(request):
        if request.method == 'POST':
            email_formset = formset_factory(EmailForm, extra=2)
            email_formset = email_formset(request.POST)
            group_name_form = GroupNameForm(request.POST)
    
            # And validate both forms if needed.
            if email_formset.is_valid() and group_name_form.is_valid():
                # Do something with cleaned_data.
                group_name_form.cleaned_data['something']
                for form_data in email_formset.cleaned_data:
                    print form_data
    

    因此,这样您将拥有一个提交按钮、一个 HTML 表单和两个 django 表单表示。如何处理它们 - 仅由您选择。

    【讨论】:

      【解决方案2】:

      我认为表单集在这里没有多大帮助,因为 OP 想要一个单一的表单。我只会制作一个带有多行文本字段的表单,要求用户每行输入一封电子邮件,或者用分号分隔它们,然后在提交表单时从那里解析电子邮件。

      如果您确实需要单独的字段,我会查看数组字段。我自己没有这样做,但是例如,这里有一个类似的问题:Django equivalent of PHP's form value array/associative array

      或者这个更好:Django: create HTML input array using a django form

      【讨论】:

      • +1 感谢@akonsu,关于表单集是正确的。我可能最终会默认使用您的解决方案,试图避免这种情况,因为根据我的经验,我要求用户将电子邮件分开,很大一部分总是以不同的方式将它们分开,或者只添加一封电子邮件。也许我可以检查所有类型的分离。快速提问:在模板中手动创建自己的表单与使用 Django 的内置表单相比有什么缺点?如果我以这种方式构建它,是否有任何问题需要注意或确保我实施?
      猜你喜欢
      • 2017-10-13
      • 2020-11-03
      • 2020-03-16
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多