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
.
Я надеюсь, что это поможет вам или другим, так как я не нашел четкого ответа в сети.