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

Django登录报auth_user.username唯一约束失败IntegrityError问题

问题原因

触发UNIQUE constraint failed: auth_user.username错误的核心原因有两个:

  1. 注册视图signup没有做用户名唯一性校验,收到POST请求就直接执行用户创建逻辑,只要提交的用户名已经存在(包括你在Admin后台提前创建的账号),就会因为auth_user表的username字段设置了唯一约束直接抛出异常。
  2. 点击登录按钮触发注册接口报错,是登录表单的action属性配置错误,把登录请求提交到了/signup路径,根本没有走登录校验逻辑,直接尝试用已存在的用户名创建新用户,自然触发冲突。
修复方案

按以下顺序调整代码即可解决问题:

  • 修正表单提交地址
    打开authentication/signin.html模板文件,确认登录表单的提交地址指向登录接口,不要误写为注册地址:
    <form method="POST" action="/signin">
        {% csrf_token %}
        <!-- 用户名、密码输入项保持原有逻辑即可 -->
    </form>
    
    同时检查注册表单authentication/signup.html的action属性,确认指向/signup,避免两个表单地址写反。
  • 给注册接口增加前置校验
    原有注册逻辑缺少必要的参数校验,除了用户名唯一性,还要补充两次密码一致性、邮箱唯一性等校验,避免直接操作数据库抛错,修改后的signup视图代码如下:
    def signup(request):
        if request.method == "POST": 
            username = request.POST.get('username')
            fname = request.POST.get('fname')
            lname = request.POST.get('lname')
            email = request.POST.get('email')
            pass1 = request.POST.get('pass1')
            pass2 = request.POST.get('pass2')
    
            # 校验两次密码输入是否一致
            if pass1 != pass2:
                messages.error(request, "两次输入的密码不匹配")
                return render(request, "authentication/signup.html")
            # 校验用户名是否已被注册
            if User.objects.filter(username=username).exists():
                messages.error(request, "该用户名已被占用,请更换后重试")
                return render(request, "authentication/signup.html")
            # 校验邮箱是否已绑定其他账号
            if User.objects.filter(email=email).exists():
                messages.error(request, "该邮箱已注册过账号")
                return render(request, "authentication/signup.html")
    
            # 所有校验通过后再创建用户
            myuser = User.objects.create_user(username, email, pass1)
            myuser.first_name = fname
            myuser.last_name = lname
            myuser.save()
            messages.success(request, "账号创建成功,请登录")
            return redirect('/signin')
    
        return render(request, "authentication/signup.html")
    
  • 修复登录视图的逻辑bug
    原有登录视图中,账号密码校验失败的分支没有加return,会导致redirect不生效,代码继续向下执行重复渲染页面,修改对应分支即可:
    def signin(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            pass1 = request.POST.get('pass1')
            user = authenticate(username=username, password=pass1)
            if user is not None:
                login(request, user)
                return render(request, "authentication/index.html")
            else:
                messages.error(request, "用户名或密码错误")
                return redirect('home') # 补充return,确保重定向生效
        return render(request, "authentication/signin.html")
    

提示:所有Django的POST表单必须在form标签内添加{% csrf_token %}模板标签,否则会触发403权限错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:09:24