You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django类视图CreateView创建用户后无法自动登录问题排查

问题:Django CreateView注册后无法自动登录,函数式视图正常

我正尝试将原有的函数式用户注册视图改写为等价的类视图(CreateView)。使用类视图注册新用户时,用户账号可成功创建,但注册完成后无法自动登录;而原函数式视图可正常实现注册后自动登录,且表单未返回任何错误。相关代码如下:

views.py(类视图,注册后不登录)

from django.contrib import messages
from django.contrib.auth import login
from django.urls import reverse_lazy
from django.views.generic import CreateView

from .forms import NewUserForm


class RegisterUserView(CreateView):
    form_class = NewUserForm
    success_url = reverse_lazy('home')
    template_name = 'users/register.html'

    def form_valid(self, form):
        user = form.save()
        login(self.request, user)

        return super().form_valid(form)

    def form_invalid(self, form):
        messages.error(self.request, form.errors)

        return super().form_invalid(form)

views.py(函数式视图,注册后可登录)

from django.contrib import messages
from django.contrib.auth import login
from django.shortcuts import redirect, render

from .forms import NewUserForm


def register_user(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)

            return redirect('home')

        messages.error(request, form.errors)

    form = NewUserForm(request.POST)

    context = {
        "form": form
    }

    return render(request, "users/register.html", context)

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser


class CustomUser(AbstractUser):
    email = models.EmailField(unique=True)

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm

from .models import CustomUser


class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = CustomUser
        fields = ["username", "email", "password1", "password2"]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.label_suffix = ""  # 移除标签后的冒号

        self.fields['username'].help_text = '仅允许字母、数字和@/./+/-/_。'
        self.fields['password1'].help_text = '8-20个字符,包含字母和数字,无空格。'
        self.fields['password2'].help_text = None

    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        if commit:
            user.save()
        return user

settings.py

AUTH_USER_MODEL = "users.CustomUser"

内容的提问来源于stack exchange,提问作者thenamethatiown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 02:28:36