Django: как войти в систему пользователя сразу после регистрации с помощью generic CreateView

С django generic CreateView я могу создать новую учетную запись пользователя, но как я могу войти в систему этого пользователя автоматически после регистрации с помощью этой техники?

urls.py ...
url (r ' ^signup/$', SignUpView.as_view (), name = 'user_signup' ), ...

views.py

class SignUpView ( CreateView ) :    
    form_class = AccountCreationForm
    template_name = 'accounts/signup.html'
    success_url = reverse_lazy( 'home' )

forms.py

class AccountCreationForm ( forms.ModelForm ) :        
    def __init__( self, *args, **kwargs ) :
        super( AccountCreationForm, self ).__init__( *args, **kwargs )
        for field in self.fields :
           self.fields[field].widget.attrs['class'] = 'form-control'

    password1 = forms.CharField( label = 'Password', widget = forms.PasswordInput )
    password2 = forms.CharField( label = 'Password confirmation', widget = forms.PasswordInput )

    class Meta :
        model = User
        fields = ( 'email', 'first_name', )

    def clean_password2 ( self ) :
        # Check that the two password entries match
        password1 = self.cleaned_data.get( "password1" )
        password2 = self.cleaned_data.get( "password2" )
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError( "Passwords don't match" )
        return password

    def save( self, commit = True ) :
        # Save the provided password in hashed format
        user = super( AccountCreationForm, self ).save( commit = False )
        user.set_password( self.cleaned_data[ "password1" ] )
        if commit:
            user.save()
        return user

1 ответов


это может быть поздно, но это был именно мой вопрос, и после нескольких часов борьбы, наконец, выяснить.

может быть, вы нашли но если другие люди ищут решение, вот это мое.

вам просто нужно переопределить form_valid() в вашем классе, наследующем CreateView. Вот пример с моим собственным классом:

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

я сначала ловлю значение моего метода родительского класса form_valid() на valid, потому что, когда вы вызываете его, он вызывает форму.сохранить(), который зарегистрируйте пользователя в базе данных и заполните self.object С созданным пользователем.

после этого у меня была длинная проблема с моей аутентификацией, возвращая None. Это потому, что я звонил authenticate() С хэшированным паролем django и аутентифицируйте его снова.

объясняя это для вас, чтобы понять, почему я использую form.cleaned_data.get('username'), а не self.object.username.

Я надеюсь, что это поможет вам или другим, так как я не нашел четкого ответа в сети.