首页 > 解决方案 > 自定义注册表单中的 Django allauth 访问请求

问题描述

我想在 Django 的 init 方法中访问请求对象allauth

我拥有的自定义表单代码

from allauth.account.forms import SignupForm
class CustomSignupForm(SignupForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'email' in self.request.session:
            self.fields['email'].value = self.request.session['email']
            self.fields['email'].disabled = True

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        return user

我使用表单的自定义视图是

from allauth.account.views import SignupView

class CustomFormSignupView(SignupView):
   form_class = CustomSignupForm

   def get_form_kwargs(self):
     kwargs = super().get_form_kwargs()
     kwargs['request'] = self.request
     return kwargs

标签: django

解决方案


实际上,您无需覆盖帐户视图即可将电子邮件放入视图中。从this implementation中,我可以看到,如果您在 session 中针对 key 设置电子邮件account_verified_email,那么它应该出现在表单中。

不过,如果您覆盖accounts.SignupView,则执行以下步骤:

首先,您需要CustomFormSignupView输入网址:

urlpatterns =+ [
     url(r'^accounts/', include('allauth.urls')),
     url(r'^accounts/signup/$', CustomFormSignupView.as_view(), name="account_signup")
]

并更新表格:

from allauth.account.forms import SignupForm
class CustomSignupForm(SignupForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super().__init__(*args, **kwargs)
        if 'email' in self.request.session:
            self.fields['email'].value = self.request.session['email']
            self.fields['email'].disabled = True

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        return user

推荐阅读