Django:如何在用户使用默认的 UserCreationForm 注册后立即登录?
Django: How to log user in right after they had registered with somewhat default UserCreationForm?
我试图在用户注册应用后立即登录,这样他们就不必在之后立即手动登录。我已经从 django 的 UserCreationForm 创建了 RegisterForm 并且它按预期工作 - 如果表单有效,它会创建一个用户对象,但我不知道如何访问创建的用户对象以使用登录功能记录它,这需要,除了请求,还有一个用户对象。注意:我已经在 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 returns 保存表单时的用户模型实例。
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse('index'))
在您的表单中,您可以访问您的用户对象,这样您就可以做类似的事情:
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse('index'))
这是关于保存方法的文档中的解释:Django Save Method
我试图在用户注册应用后立即登录,这样他们就不必在之后立即手动登录。我已经从 django 的 UserCreationForm 创建了 RegisterForm 并且它按预期工作 - 如果表单有效,它会创建一个用户对象,但我不知道如何访问创建的用户对象以使用登录功能记录它,这需要,除了请求,还有一个用户对象。注意:我已经在 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 returns 保存表单时的用户模型实例。
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse('index'))
在您的表单中,您可以访问您的用户对象,这样您就可以做类似的事情:
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse('index'))
这是关于保存方法的文档中的解释:Django Save Method