Python Django:如何在注册后使用通用CreateView直接登录用户
使用django generic CreateView,我可以创建一个新的用户帐户,但如何在使用此技术注册后自动登录此用户 url.pyPython 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 =
...
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
是的,这正是我找到的解决方案。我在尝试使用哈希传递进行身份验证时也浪费了一些时间