使用表单向导作为注册表单django allauth

时间:2014-10-25 20:25:09

标签: django django-forms django-allauth

我正在尝试在注册/注册过程中实现表单向导。我使用django-allauth进行身份验证,并基于文档和上一个问题How to customize user profile when using django-allauth它介绍了如何在注册表单中添加额外字段。我真的不知道如何覆盖默认表单以使用表单向导。我正在考虑的一个选项是将所有额外的字段添加到注册表单,然后使用ajax显示表单的部分,但我不确定如何在不同的部分上实现验证。任何关于如何以向导实施注册步骤的指导或帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我最近通过以下方式做到了这一点:

views.py

from allauth.account.forms import SignupForm
from allauth.account.utils import complete_signup

SIGNUP_FORMS = [('signup', SignupForm),
                ('profile', forms.UserProfileForm)]

TEMPLATES = {'signup': 'trips/forms/wizard_form.html',
             'profile': 'trips/forms/wizard_form.html'}

class SignupWizard(SessionWizardView):
    def get_template_names(self):
        return [TEMPLATES[self.steps.current]]

    def done(self, form_list, **kwargs):
        for form in form_list:
            if isinstance(form, SignupForm):
                user = form.save(self.request)
                complete_signup(self.request, user, settings.ACCOUNT_EMAIL_VERIFICATION, settings.LOGIN_REDIRECT_URL)
            elif isinstance(form, forms.UserProfileForm):
                userprofile = form.save(commit=False)
                user = self.request.user
                userprofile.user = user
                userprofile.save()
        return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)

您可以根据需要添加任意数量的表单。在我的例子中,UserProfileForm是一个ModelForm,它创建一个与User一对一的新UserProfile对象。只有在成功提交两个表单后才会保存这两个对象。 complete_signup函数来自allauth,它会进行一些清理,然后将用户登录到站点。

答案 1 :(得分:0)

我最终使用AngularJS Django-angular packagethis library从客户端实现了向导。在深入了解allauth注册视图代码后,我发现它已经实现了AjaxCapableProcessFormViewMixin

使用django-allauth时使用客户端代码为注册过程实现向导可能是最佳方法,因为您可以延迟成功重定向,直到向导中的所有表单都填满,并且还可以防止拆分长注册形成较小的形式。

相关问题