Django登录报auth_user.username唯一约束失败IntegrityError问题
问题原因
触发UNIQUE constraint failed: auth_user.username错误的核心原因有两个:
- 注册视图
signup没有做用户名唯一性校验,收到POST请求就直接执行用户创建逻辑,只要提交的用户名已经存在(包括你在Admin后台提前创建的账号),就会因为auth_user表的username字段设置了唯一约束直接抛出异常。 - 点击登录按钮触发注册接口报错,是登录表单的
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
相关产品推荐
相关产品推荐

