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

75 投票
7 回答
169861 浏览
提问于 2025-04-16 14:52

我在Django中实现了一个密码找回的功能。我的方法是将新密码发送到用户输入的邮箱。当输入正确的邮箱(也就是数据库中存在的邮箱)时,这个功能运行得很好。但是,如果输入一个不在数据库中的邮箱,就会出现错误:
'DoesNotExist at /forgotPassword/ UniversityDetails matching query does not exist.'

我该如何解决这个问题呢?

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><br/> <input type="text" name="email" size="25" /> 
 <input type="submit" value="Submit" />
 </div> 

</form >

7 个回答

8

我也遇到过这个问题。这个问题是因为在Aptana中调试中止后,开发服务器没有删除django的会话,而后又删除了数据库。也就是说,下次开发服务器启动时,会话中仍然保存着一个不存在的数据库记录的ID。

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

request.session.flush()
15

正如在Django文档中提到的,当使用get方法找不到任何记录或者找到多条记录时,它会抛出一个异常,这种行为是正常的:

如果找到多个对象,get()会抛出一个叫做MultipleObjectsReturned的异常。这个异常是模型类的一个属性。

如果根据给定的参数没有找到对象,get()会抛出一个叫做DoesNotExist的异常。这个异常也是模型类的一个属性。

使用异常处理是一种解决这个问题的方法,但我其实不太喜欢那种复杂的try-except结构。对我来说,一个更简单的解决方案是结合使用filterfirst

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

当你对一个空的查询集使用.first()时,它会返回None。这样你就可以用一行代码达到同样的效果。

捕获异常和使用这种方法之间唯一的区别在于,当你有多条记录时,前者会抛出异常,而后者会返回第一条记录。不过,既然你在使用get,我可以假设我们不会遇到这种情况。

请注意,first方法是在Django 1.6版本中添加的。

186
try:
    user = UniversityDetails.objects.get(email=email)
except UniversityDetails.DoesNotExist:
    user = None

我注意到你把密码直接存成明文了(这可真是个大问题,安全性很差!)。建议你考虑使用内置的认证系统来处理密码。

撰写回答