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