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

如何从Django models中查询匹配POST参数的特定记录?

你写的candidate.objects.get(email=request.POST['emails'], password=request.POST['passwd'])本身就完全对应你要的MySQL select * from table where email = someemail and pass = somepasswd 逻辑,语法没有问题,查询不生效可以从以下场景排查调整:

  • 先校验参数传递是否正确:
    确认前端登录表单中,邮箱输入框的name属性是emails、密码输入框的name属性是passwd,身份单选按钮提交的值精确等于Candidate(注意大小写、前后空格,任意不匹配都会导致不会进入查询分支)
  • 确认密码存储格式:
    如果你在用户注册逻辑中对密码做了哈希加密(比如用了Django自带的make_password方法),直接拿POST提交的明文密码去匹配哈希后的存储值肯定会查询失败。这种情况下正确的逻辑是先按邮箱查询用户,再校验密码:
    # 替换原来的get查询逻辑
    try:
        udetails = candidate.objects.get(email=request.POST['emails'])
    except candidate.DoesNotExist:
        messages.error(request,'邮箱或密码错误')
        return render(request,'login.html')
    # 校验密码,如果你是用Django默认加密的话
    if not udetails.check_password(request.POST['passwd']):
        messages.error(request,'邮箱或密码错误')
        return render(request,'login.html')
    
  • 优化异常捕获定位问题:
    你现在的全局except会吞掉所有错误,没法区分是查询不到匹配记录、还是POST参数不存在、还是其他逻辑错误,建议调整异常捕获逻辑打印报错:
    except Exception as e:
        print("登录报错详情:", e) # 开发阶段可以直接在控制台看具体错误类型
        messages.error(request,'login failed...')
        return render(request,'login.html')
    
  • 如果你需要兼容可能存在的重复数据场景(虽然email是主键不会重复),也可以用filter写法实现同样的查询逻辑:
    udetails = candidate.objects.filter(email=request.POST['emails'], password=request.POST['passwd']).first()
    if not udetails:
        # 匹配不到记录的逻辑
        messages.error(request,'登录失败')
        return render(request,'login.html')
    

安全提示:不要明文存储用户密码,也不要把明文密码直接放到查询条件中,先按唯一索引(邮箱)查询用户再校验密码的方式可以避免时序攻击风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:18:00