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

我已经在django中实现了密码恢复function。 用我的方法,新的密码将被发送到他input的电子邮件ID。 而且,当我给出正确的电子邮件(数据库中存在的电子邮件ID)时,它的工作正常。 但是,当我给一个电子邮件ID不在数据库中,它给了我这个错误“DoesNotExist at / forgotPassword /

UniversityDetails匹配查询不存在。“ 有人可以帮助解决这个问题吗? 将粘贴我的代码在这里。 有人可以帮我解决这个问题吗?

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 > 
 try: user = UniversityDetails.objects.get(email=email) except UniversityDetails.DoesNotExist: user = None 

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

我也有这个问题。 这是由于开发服务器在Aptana中的debugging终止之后没有删除django会话,导致后续数据库被删除。 (意味着下次开发服务器启动时,会话中不存在的数据库logging的标识仍然存在)

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

 request.session.flush() 

如果有人在这里,另外两个解决scheme没有成功,请检查你正在使用什么来过滤你所期望的:

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

是电子邮件的string,或无? 或一个整数?

你可以试试这个方法。 只是使用一个函数来获取你的对象

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

正如在Django文档中提到的, get方法找不到条目或find多个条目时,会引发exception,这是预期的行为:

如果find多个对象,get()会引发MultipleObjectsReturned。 MultipleObjectsReturnedexception是模型类的一个属性。

如果找不到给定参数的对象,get()会引发一个DoesNotExistexception。 这个exception是模型类的一个属性。

使用exception是处理这个问题的一种方法,但我实际上不喜欢丑陋的try-except块。 另一种解决scheme,对我来说更清洁,就是先使用filter +的组合。

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

当您执行.first()到一个空的查询集时,它将返回None 。 这样你可以在一行中产生相同的效果。

捕获exception和使用这种方法之间的唯一区别是当你有多个条目时,前者会引发exception,而后者会设置第一个元素,但是当你使用get我可能会认为我们不会在这种情况下。

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