Django: Как войти в систему сразу после регистрации пользователя с помощью несколько стандартной UserCreationForm?
Я пытаюсь зарегистрировать пользователя сразу после того, как он зарегистрировался в приложении, чтобы ему не нужно было вручную входить в систему сразу после этого. Я создал RegisterForm из django's UserCreationForm, и она работает как надо - она создает объект User, если форма действительна, но я не знаю, как получить доступ к этому созданному объекту User, чтобы войти в систему с помощью функции login, которая требует, помимо запроса, еще и объект user. Примечание: я отредактировал User по умолчанию в models.py. Вот мой код:
class RegisterForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args,**kwargs)
self.fields['username'].widget.attrs.update({'class':'form-control','id':'username', 'aria-describedby':'usernameHelp'})
self.fields['password1'].widget.attrs.update({'class':'form-control','id':'password1', 'aria-describedby':'password1Help'})
self.fields['password2'].widget.attrs.update({'class':'form-control','id':'password2','aria-describedby':'password2Help'})
class Meta:
model = User
fields = ['username', 'password1', 'password2', 'email', 'first_name', 'last_name',
'photo', 'amazon', 'twitter', 'facebook', 'instagram', 'youtube']
widgets = {
'email':EmailInput(attrs={'class':'form-control', 'id':'email', 'aria-describedby':'emailHelp'}),
'first_name':TextInput(attrs={'class':'form-control', 'id':'first_name',}),
'last_name':TextInput(attrs={'class':'form-control','id':'last_name', 'aria-describedby':'nameHelp'}),
'photo':ClearableFileInput(attrs={'class':'form-control','id':'photo', 'aria-describedby':'photoHelp'}),
'amazon':URLInput(attrs={'class':'form-control', 'id':'amazon', 'aria-describedby':'amazonHelp'}),
'twitter':URLInput(attrs={'class':'form-control', 'id':'twitter', 'aria-describedby':'twitterHelp'}),
'facebook':URLInput(attrs={'class':'form-control', 'id':'facebook', 'aria-describedby':'facebookHelp'}),
'instagram':URLInput(attrs={'class':'form-control', 'id':'instagram', 'aria-describedby':'instagramHelp'}),
'youtube':URLInput(attrs={'class':'form-control', 'id':'youtube', 'aria-describedby':'youtubeHelp'})
}
А вот вид:
def register(request):
# POST
if request.method == "POST":
# In addition to our form we must make sure to get the files too, if photo is uploaded
form = RegisterForm(request.POST, request.FILES or None)
if form.is_valid():
form.save()
#user = User.objects.get() ???
#login(request, user)
return HttpResponseRedirect(reverse('index'))
else:
return render(request, "astator/register.html",
{"form":form,
"message":"Something went wrong. Please try filling out the fields again. Make sure that your passwords match and that they satisfy the requirements listed bellow."
})
# GET
else:
form = RegisterForm()
return render(request, "astator/register.html", {"form":form})
вы можете создать html страницу и вызвать этот classView из этого url и вы можете использовать аутентификацию django для большего удобства
class LoginForm(AuthenticationForm):
username = UsernameField(widget=forms.TextInput(
attrs={'autofocus': True, 'class': 'form-control'}))
password = forms.CharField(label=_("Password"), strip=False, widget=forms.PasswordInput(
attrs={'autocomplete': 'current-password', 'class': 'form-control'}))
Подобно формам моделей в целом, UserCreationForm возвращает экземпляр модели пользователя, когда вы сохраняете форму.
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse('index'))
В вашей форме вы можете получить доступ к объекту user, поэтому вы можете сделать что-то вроде этого :
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse('index'))
Это объясняется в документации относительно метода сохранения : Django Save Method