Django中的匹配查询不存在错误
我在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 个回答
我也遇到过这个问题。这个问题是因为在Aptana中调试中止后,开发服务器没有删除django的会话,而后又删除了数据库。也就是说,下次开发服务器启动时,会话中仍然保存着一个不存在的数据库记录的ID。
为了解决这个问题,我在开发过程中使用了
request.session.flush()
正如在Django文档中提到的,当使用get
方法找不到任何记录或者找到多条记录时,它会抛出一个异常,这种行为是正常的:
如果找到多个对象,
get()
会抛出一个叫做MultipleObjectsReturned的异常。这个异常是模型类的一个属性。如果根据给定的参数没有找到对象,
get()
会抛出一个叫做DoesNotExist的异常。这个异常也是模型类的一个属性。
使用异常处理是一种解决这个问题的方法,但我其实不太喜欢那种复杂的try-except
结构。对我来说,一个更简单的解决方案是结合使用filter
和first
。
user = UniversityDetails.objects.filter(email=email).first()
当你对一个空的查询集使用.first()
时,它会返回None
。这样你就可以用一行代码达到同样的效果。
捕获异常和使用这种方法之间唯一的区别在于,当你有多条记录时,前者会抛出异常,而后者会返回第一条记录。不过,既然你在使用get
,我可以假设我们不会遇到这种情况。
请注意,first
方法是在Django 1.6版本中添加的。
try:
user = UniversityDetails.objects.get(email=email)
except UniversityDetails.DoesNotExist:
user = None
我注意到你把密码直接存成明文了(这可真是个大问题,安全性很差!)。建议你考虑使用内置的认证系统来处理密码。