Dimitris Kougioumtzis
Dimitris Kougioumtzis

Reputation: 2439

Django allauth access request in custom signup form

I want to access the request object in the init method of Django allauth

the custom form code I have

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

The custom view that i use the form is

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

Upvotes: 2

Views: 378

Answers (1)

ruddra
ruddra

Reputation: 51938

Actually you don't need to override account's view to put email in the view. From this implementation, I can see that if you set the email in session against key account_verified_email, then it should appear in the form.

Still, if you override the accounts.SignupView, then do the following steps:

First, you need to put CustomFormSignupView in the url:

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

And update the form:

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

Upvotes: 3

Related Questions