繁体   English   中英

Django:如何使用通用CreateView在注册后直接登录用户

[英]Django: How to login user directly after registration using 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

这可能是晚了,但这正是我的问题,经过几个小时的挣扎终于找到了答案。

也许你找到了,但如果其他人正在寻找解决方案,这就是我的。

您只需在类继承CreateView时覆盖form_valid() 以下是我自己的类的示例:

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

我首先在valid捕获父类方法form_valid()的值,因为当你调用它时,它调用form.save(),它在数据库中注册你的用户并用创建的用户填充你的self.object

之后我的身份验证问题很长,返回None 这是因为我使用django哈希密码调用authenticate() ,并再次验证哈希值。

解释这个让你理解为什么我使用form.cleaned_data.get('username')而不是self.object.username

我希望它可以帮助你或其他,因为我没有在网上找到明确的答案。

在Django 2.2中,我没有像Bestasttung那样设法让它工作。 但我在form_valid方法中进行了一些小改动。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM