Django登录注册问题:注册数据存auth_user而非自定义表且无法登录
Django注册登录问题修复方案
一、登录失败的核心问题及修复
你的登录代码存在两个致命错误:
auth.authenticate参数错误:Django自带的authenticate方法默认仅接受username和password作为验证参数,你传入的email和password1无法匹配到用户。若要通过邮箱登录,需先通过邮箱找到对应用户名,再用用户名+密码组合验证。- 登录方法名称错误:Django的登录方法是全小写的
auth.login(),你写成了auth.LOGIN(),会直接触发报错。
修复后的登录代码:
def LOGIN(request): if request.method == 'POST': email = request.POST['email'] password1 = request.POST['password1'] # 通过邮箱查找用户 try: user = User.objects.get(email=email) # 使用用户名和密码完成验证 authenticated_user = auth.authenticate(username=user.username, password=password1) if authenticated_user is not None: auth.login(request, authenticated_user) # 建议跳转到首页/用户中心,而非登录页 return redirect('/') else: messages.info(request, 'mmm :( 无效的凭证 ') return redirect('LOGIN') except User.DoesNotExist: messages.info(request, 'mmm :( 该邮箱未注册 ') return redirect('LOGIN') # 补充GET请求的返回逻辑 return render(request, 'LOGIN.html')
二、注册数据同步到helloworld_register表的处理
当前注册逻辑仅创建了auth_user表的记录,未同步生成helloworld_register表的实例。需先确保你已定义好该模型(通常与User为一对一关联),再在创建用户后同步生成对应记录。
假设你的helloworld_register模型结构如下(可根据实际字段调整):
# models.py from django.contrib.auth.models import User class Register(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) # 其他自定义字段...
修复后的注册代码:
# 先导入自定义的Register模型 from helloworld.models import Register def Register(request): if request.method == 'POST': username = request.POST['username'] email = request.POST['email'] first_name = request.POST['first_name'] last_name = request.POST['last_name'] password1 = request.POST['password1'] password2 = request.POST['password2'] # 新增:验证两次输入的密码是否一致 if password1 != password2: messages.info(request, 'uh oh..:( 两次输入的密码不一致 ') return redirect('/Register') if User.objects.filter(email=email).exists(): messages.info(request, 'uh oh..:( 该邮箱已被使用 ') return redirect('/Register') # 注意:first_name重复概率高,若非业务强制要求,不建议作为唯一验证条件 if User.objects.filter(first_name=first_name).exists(): messages.info(request, 'uh oh..:( 该名字已被使用 ') return redirect('/Register') # 创建auth_user记录(create_user已自动保存,无需额外调用user.save()) user = User.objects.create_user( username=username, email=email, first_name=first_name, last_name=last_name, password=password1 ) # 同步创建helloworld_register记录,关联刚生成的用户 Register.objects.create(user=user) # 若有自定义字段,可补充:Register.objects.create(user=user, 字段名=对应值) messages.info(request, '注册完成,请登录继续..:)') return redirect('/LOGIN') return render(request, 'Register.html')
额外注意事项
- 注册流程必须验证两次密码一致性,你之前的代码完全遗漏了这个逻辑,会导致用户输入错误密码仍能注册成功。
user.save()属于冗余代码,create_user方法已自动完成用户数据的保存操作。- 登录成功后避免跳回登录页,建议跳转至首页或用户中心,避免用户产生登录失败的误解。
内容的提问来源于stack exchange,提问作者Akshay Dj
相关产品推荐
相关产品推荐

