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 表单中多次包含相同的字段?的主要内容,如果未能解决你的问题,请参考以下文章