With django generic CreateView I can create a new user account, but how can I login this user automatically after registration using this technique?
urls.py
<In Django 2.2 I didn't managed to have it working as Bestasttung posted. But I managed with a small change in the form_valid method.
class CreateAccountView(CreateView):
template_name = 'auth/create_account.html'
form_class = SignInForm
success_url = '/'
def form_valid(self, form):
valid = super().form_valid(form)
# Login the user
login(self.request, self.object)
return valid
it's maybe late but that was exactly my question, and after some hours of struggling finally find out.
Maybe you found but if other people are looking for a solution, here is mine.
You just have to override form_valid() in your class Inheriting CreateView. Here is the example with my own class :
class CreateArtistView(CreateView):
template_name = 'register.html'
form_class = CreateArtistForm
success_url = '/'
def form_valid(self, form):
valid = super(CreateArtistView, self).form_valid(form)
username, password = form.cleaned_data.get('username'), form.cleaned_data.get('password1')
new_user = authenticate(username=username, password=password)
login(self.request, new_user)
return valid
I first catch the value of my parent class method form_valid() in valid, because when you call it, it calls the form.save(), which register your user in database and populate your self.object with the user created.
After that I had a long problem with my authenticate, returning None. It's because I was calling authenticate() with the django hashed password, and authenticate hash it again.
Explaining this for you to understand why I use form.cleaned_data.get('username') and not self.object.username.
I hope it helps you or other, since I didn't find a clear answer on the net.