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

Django注册页面认证报错:local variable 'user' referenced before assignment

解决Django注册页面的local variable 'user' referenced before assignment错误

嘿,我来帮你搞定这个问题!这个报错的原因其实很清晰:你在代码的except User.DoesNotExist分支里创建了用户,但没有把创建好的用户实例赋值给user变量,导致后续调用auth.login(request, user)时,user还没被定义,自然触发了“局部变量在赋值前被引用”的错误。

错误代码的核心问题

看你这段关键代码:

except User.DoesNotExist:
    User.objects.create_user(request.POST['username'], password = request.POST['password1'])
    auth.login(request,user)

User.objects.create_user()方法会返回新创建的用户对象,但你没有把这个对象存到user变量里——此时user只在try块里查询用户时被定义过,except块里完全没这个变量,所以登录操作自然找不到它。

修正后的完整代码

只需要把创建用户的结果赋值给user变量就行,同时我还补充了GET请求的处理(避免用户直接访问注册页面时返回空响应):

from django.contrib.auth import login
from django.contrib.auth.models import User
from django.shortcuts import render, redirect

def signup(request):
    if request.method == 'POST':
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        username = request.POST['username']
        
        if password1 == password2:
            try:
                user = User.objects.get(username=username)
                return render(request, 'accounts/signup.html', {'error': 'Try another username'})
            except User.DoesNotExist:
                # 把创建的用户对象赋值给user变量
                user = User.objects.create_user(username=username, password=password1)
                login(request, user)
                return redirect('home')
        else:
            return render(request, 'accounts/signup.html', {'error': 'Passwords do not match'})
    # 处理GET请求,返回注册页面
    else:
        return render(request, 'accounts/signup.html')

额外小建议

  • 实际项目里更推荐用Django自带的UserCreationForm或者自定义ModelForm来处理注册表单,它能自动帮你做数据验证(比如用户名格式、密码强度),代码也更简洁规范。
  • 可以把表单字段的值先提取到变量里,避免多次调用request.POST,代码可读性会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:22:53