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

Python Django:如何在注册后使用通用CreateView直接登录用户,python,django-authentication,django-generic-views,Python,Django Authentication,Django Generic Views,使用django generic CreateView,我可以创建一个新的用户帐户,但如何在使用此技术注册后自动登录此用户 url.py ... url( r'^signup/$', SignUpView.as_view(), name = 'user_signup' ), ... views.py class SignUpView ( CreateView ) : form_class = AccountCreationForm template_name =

使用django generic CreateView,我可以创建一个新的用户帐户,但如何在使用此技术注册后自动登录此用户

url.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\u 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\u valid()
的值,因为当您调用它时,它调用form.save(),它在数据库中注册您的用户,并用用户创建的对象填充您的
self.object

之后,我的身份验证出现了一个长期问题,返回
None
。这是因为我使用django哈希密码调用了
authenticate()
,然后再次对其进行哈希验证

通过解释这一点,您可以理解为什么我使用
form.cleaned\u data.get('username')
而不是
self.object.username


我希望它能帮助你或其他人,因为我在网上没有找到一个明确的答案

在Django 2.2中,我没有让它按发布的方式工作。但是我设法在形式上做了一个小小的改变

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

是的,这正是我找到的解决方案。我在尝试使用哈希传递进行身份验证时也浪费了一些时间