首页 文章

匹配查询不存在Django中的错误

提问于
浏览
46

我在django中实现了密码恢复功能 . 使用我的方法,新密码将被发送到他输入的电子邮件ID . 当我提供正确的电子邮件(数据库中存在的电子邮件ID)时,它的工作正常 . 但是当我给出一个不在数据库中的电子邮件ID时,它会给我这个错误'DoesNotExist at / forgotPassword /

大学详细信息匹配查询不存在 . ' . 有人可以帮助解决这个问题 . 将粘贴我的代码 . 有人可以帮我解决这个问题 .

forgotPassword.html()

def forgotPassword(request):
    if request.POST:
        email=request.POST.get("email")
        user = UniversityDetails.objects.get(email=email)
        if(not user):
            print "No user"
            return render_to_response("forgotPassword.html")
        else:
            newPassword = user.password
            send_mail('Password Recovery', 'The password for your site is '+ newPassword, 'rv_nair@gmail.com',
    ['rv_ks@gmail.com'], fail_silently=False)   
            return render_to_response("passwordRecovery.html")
    return render_to_response('forgotPassword.html')

html

<form name="forgotPassword" method="POST" id="myFormid" action="http://10.1.0.90:8080/forgotPassword/">
<div style="float:center;width:100%;color:#0000A0">
 Enter your E-mail ID</label>
<input type="text" name="email" size="25" /> <input type="submit" value="Submit" /> </div> </form >

6 回答

  • 1

    我也有这个问题 . 这是由于开发服务器在Aptana中的调试中止后没有删除django会话而导致后续数据库删除 . (意味着下次开发服务器启动时会话中仍存在不存在的数据库记录的ID)

    为了在开发过程中解决这个问题,我用了

    request.session.flush()
    
  • 1

    你可以尝试这种方式 . 只需使用一个函数来获取您的对象

    def get_object(self, id):
        try:
            return UniversityDetails.objects.get(email__exact=email)
        except UniversityDetails.DoesNotExist:
            return False
    
  • 136
    try:
        user = UniversityDetails.objects.get(email=email)
    except UniversityDetails.DoesNotExist:
        user = None
    

    我也看到你用明文存储你的密码(一个很大的安全禁止!) . 你为什么不使用内置的auth系统?

  • 0

    Django docs中所述,当 get 方法找不到条目或找到多个条目时,它会引发异常,这是预期的行为:

    如果找到多个对象,则get()引发MultipleObjectsReturned . MultipleObjectsReturned异常是模型类的属性 . 如果找不到给定参数的对象,get()会引发一个DoesNotExist异常 . 此异常是模型类的属性 .

    使用异常是一种处理这个问题的方法,但我实际上并不喜欢丑陋的 try-except 块 . 另一种解决方案,对我来说更清洁,就是使用 filter first 的组合 .

    user = UniversityDetails.objects.filter(email=email).first()
    

    当您对空的查询集执行 .first() 时,它返回 None . 这样,您可以在一行中获得相同的效果 .

    捕获异常和使用此方法之间的唯一区别是,当您有多个条目时,前者将引发异常而后者将设置第一个元素,但是当您使用 get 时,我可能会认为我们不会陷入这种情况 .

    请注意,在Django 1.6上添加了 first 方法 .

  • 7

    您可以在您的情况下使用它,它将正常工作 .

    user = UniversityDetails.objects.filter(email = email).first()

  • 1

    如果有人在这里并且其他两个解决方案没有成功,请检查您使用的过滤器是否符合预期:

    user = UniversityDetails.objects.get(email=email)
    

    是电子邮件字符串,还是无?还是整数?

相关问题