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

时间:2011-08-31 20:35:17

标签: django django-forms

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

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

当用户邀请一个人时,它可以很好地工作,但我希望允许用户根据自己的喜好邀请尽可能多的朋友。我试图构建的实现是显示包含3个电子邮件字段的表单,并允许用户使用jQuery在客户端动态添加更多字段。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为formsets在这方面没有多大帮助,因为OP希望拥有单一的表单。我只想创建一个带有多行文本字段的表单,要求用户每行输入一封电子邮件,或者用分号分隔它们,并在提交表单时从那里解析电子邮件。

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

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

答案 1 :(得分: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表单表示。如何处理它们 - 只有你自己的选择。