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

Django用户注册表单无法创建用户问题求助

Django 用户注册表单无法创建用户的问题排查与修复

以下是针对你代码中问题的逐一排查和修复方案:

1. 表单提交方法错误(核心问题)

模板中的 <form> 标签未指定 method="POST",默认使用 GET 请求,导致提交表单时不会进入视图的 POST 处理分支,完全跳过用户创建逻辑。

修复模板代码:
修改表单标签:

<form action="{% url 'register' %}" method="POST">

2. 视图函数逻辑错误

视图的 else 分支中错误打印了 something went wrong —— 当请求为 GET(比如首次访问注册页面)属于正常情况,不该标记为错误。

修复视图代码:

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            phone_number = form.cleaned_data['phone_number']
            email = form.cleaned_data['email']
            password = form.cleaned_data['password']
            username = email.split("@")[0]

            user = Account.objects.create_user(
                first_name=first_name, 
                last_name=last_name, 
                email=email, 
                username=username,
                password=password
            )
            user.phone_number = phone_number
            user.save()
            # 建议添加注册成功后的重定向,比如跳转到登录页
            # return redirect('login')
    else:
        # 正常初始化空表单,移除错误打印
        form = RegistrationForm()

    context = {'form': form}
    return render(request, 'accounts/register.html', context)

3. 用户默认未激活导致后续登录失败

Account 模型中 is_active 默认值为 False,创建用户后账户处于未激活状态,即使注册成功也无法登录。若不需要邮件激活流程,可直接激活用户:

方式一:在视图中激活用户

user = Account.objects.create_user(
    first_name=first_name, 
    last_name=last_name, 
    email=email, 
    username=username,
    password=password
)
user.phone_number = phone_number
user.is_active = True  # 新增:激活用户
user.save()

方式二:修改用户管理器默认激活

修改 MyAccountManager 的 create_user 方法:

def create_user(self, first_name, last_name, username, email, password=None):
    if not email:
        raise ValueError('User must have an email address')
    if not username:
        raise ValueError('User must have a username')
    
    user = self.model(
        email=self.normalize_email(email),
        username=username,
        first_name=first_name,
        last_name=last_name,
    )
    user.set_password(password)
    user.is_active = True  # 新增:默认激活用户
    user.save(using=self._db)
    return user

4. 表单 clean 方法遗漏返回 cleaned_data

表单的 clean 方法调用父类方法后未返回清理后的数据,可能导致表单数据丢失或验证异常。

修复表单代码:

def clean(self):
    cleaned_data = super(RegistrationForm, self).clean()
    password = cleaned_data.get('password')
    confirm_password = cleaned_data.get('confirm_password')

    if password != confirm_password:
        raise forms.ValidationError('Passwords do not match')
    
    return cleaned_data  # 新增:返回清理后的数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:45:28