Django: How to login user directly after registration using generic CreateView

后端 未结 2 1526
生来不讨喜
生来不讨喜 2020-12-14 03:58

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

<
相关标签:
2条回答
  • 2020-12-14 04:38

    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
    
    0 讨论(0)
  • 2020-12-14 04:40

    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.

    0 讨论(0)
提交回复
热议问题