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

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')

故障排查与解决建议

针对账号创建故障

  1. 密码存储错误: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
    )
    
  2. 用户组关联语法错误:pat_group.user.set.add(user)是错的,Django反向关联字段是模型名_set,正确写法是pat_group.user_set.add(user),这个错误会导致用户无法被分配到Patient组。
  3. 异常信息被隐藏:取消注释print(e),直接查看创建过程中抛出的具体错误(比如Group不存在、日期格式不匹配、字段长度超限等)。
  4. 添加事务保证数据一致性:创建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)
    

针对登录故障

  1. 组索引越界导致异常:request.user.groups.all()[0].name如果用户没有组或组列表为空,会直接抛出异常进入except,最终返回登录页。先判断组是否存在:
    groups = request.user.groups.all()
    if groups:
        g = groups[0].name
        # 后续跳转逻辑
    else:
        error = "yes"  # 用户未分配组
    
  2. 未传递错误状态到登录页:最后返回render(request,'login.html')时没传error变量,页面无法显示错误提示,用户误以为无反应。修改为:
    return render(request,'login.html', {'error': error})
    
  3. 未处理无匹配角色的情况:如果用户组不在预设的三个角色内,代码会跳出所有elif,直接返回登录页。添加else分支处理:
    elif g == 'Patient':
        # 现有跳转逻辑
    else:
        error = "yes"  # 角色无权限
    

额外检查项

  • 确认auth_group表中存在Doctor、Receptionist、Patient三个组
  • 检查登录表单的输入框name属性是否为email和password,确保request.POST能正确取值
  • 手动添加用户后,确认User表中密码是哈希值,且用户已关联到对应组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:20:24