Django:如何在 Django 表单中多次包含相同的字段?

Posted

技术标签:

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

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

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

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

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

谢谢!

【问题讨论】:

【参考方案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 的内置表单相比有什么缺点?如果我以这种方式构建它,是否有任何问题需要注意或确保我实施?

以上是关于Django:如何在 Django 表单中多次包含相同的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Django表单在单个HTML中多次使用,避免重复的id

Django 函数包含多个带返回的函数

Django:如何包含模型表单?

django:如何从包含外键的多个模型中制作一个表单

Django - 如果我在视图中将 2 个表单集放在一起,则添加多次相同视图的功能不起作用

如何在渲染django模板时动态设置表单选择字段的初始值