Django登录与账号创建故障求助:登录无跳转、数据未保存
Django登录与账号创建故障排查
故障现象
- 登录故障:无论账号信息正确与否,登录页面仅刷新无跳转,终端日志显示
POST /login/ HTTP/1.1" 200 3689 - 账号创建故障:创建账号时数据无法存入数据库,手动添加数据库信息后登录仍失败
相关代码片段
loginpage 视图(views.py)
def loginpage(request): error = "" page = "" if request.method == 'POST': u = request.POST['email'] p = request.POST['password'] user = authenticate(request,username=u,password=p) try: if user is not None: login(request,user) error = "no" g = request.user.groups.all()[0].name if g == 'Doctor': page = 'doctor' d = {'error': error, 'page':page} return render(request,'doctorhome.html',d) elif g == 'Receptionist': page = 'reception' d = {'error': error, 'page':page} return render(request,'receptionhome.html',d) elif g == 'Patient': page = 'patient' d = {'error': error, 'page':page} return render(request,'patienthome.html',d) else: error = "yes" except Exception as e: error = "yes" #print(e) #raise e return render(request,'login.html')
createaccountpage 视图(views.py)
def createaccountpage(request): error = "" user="none" if request.method == 'POST': name = request.POST['name'] email = request.POST['email'] password = request.POST['password'] repeatpassword = request.POST['repeatpassword'] gender = request.POST['gender'] phonenumber = request.POST['phonenumber'] address = request.POST['address'] birthdate = request.POST['dateofbirth'] bloodgroup = request.POST['bloodgroup'] try: if password == repeatpassword: Patient.objects.create(name=name,email=email,password=password,gender=gender,phonenumber=phonenumber,address=address,birthdate=birthdate,bloodgroup=bloodgroup) user = User.objects.create_user(name=name,email=email,password=password,username=email) pat_group = Group.objects.get(name='Patient') pat_group.user.set.add(user) user.save() error = "no" else: error = "yes" except Exception as e: error = "yes" print("Erorr:",e) d = {'error' : error} #print(error) return render(request,'createaccount.html',d) #return render(request,'createaccount.html')
故障排查与解决建议
针对账号创建故障
- 密码存储错误:
Patient.objects.create直接存明文密码,而Django的authenticate只认User模型的哈希密码。必须给Patient的密码做哈希处理:from django.contrib.auth.hashers import make_password # 创建Patient时替换密码字段 Patient.objects.create( name=name, email=email, password=make_password(password), gender=gender, phonenumber=phonenumber, address=address, birthdate=birthdate, bloodgroup=bloodgroup ) - 用户组关联语法错误:
pat_group.user.set.add(user)是错的,Django反向关联字段是模型名_set,正确写法是pat_group.user_set.add(user),这个错误会导致用户无法被分配到Patient组。 - 异常信息被隐藏:取消注释
print(e),直接查看创建过程中抛出的具体错误(比如Group不存在、日期格式不匹配、字段长度超限等)。 - 添加事务保证数据一致性:创建Patient和User是两个独立操作,用事务包裹避免部分成功:
from django.db import transaction # 在try块内添加 with transaction.atomic(): Patient.objects.create(...) user = User.objects.create_user(...) pat_group.user_set.add(user)
针对登录故障
- 组索引越界导致异常:
request.user.groups.all()[0].name如果用户没有组或组列表为空,会直接抛出异常进入except,最终返回登录页。先判断组是否存在:groups = request.user.groups.all() if groups: g = groups[0].name # 后续跳转逻辑 else: error = "yes" # 用户未分配组 - 未传递错误状态到登录页:最后返回
render(request,'login.html')时没传error变量,页面无法显示错误提示,用户误以为无反应。修改为:return render(request,'login.html', {'error': error}) - 未处理无匹配角色的情况:如果用户组不在预设的三个角色内,代码会跳出所有
elif,直接返回登录页。添加else分支处理:elif g == 'Patient': # 现有跳转逻辑 else: error = "yes" # 角色无权限
额外检查项
- 确认
auth_group表中存在Doctor、Receptionist、Patient三个组 - 检查登录表单的输入框
name属性是否为email和password,确保request.POST能正确取值 - 手动添加用户后,确认
User表中密码是哈希值,且用户已关联到对应组
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

