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

我已经在 django 中实现了一个密码恢复功能。使用我的方法,新的密码将被发送到输入的电子邮件 ID。如果给出了正确的电子邮件(数据库中存在的电子邮件 ID) ,它就可以正常工作。但是,当给出一个不在数据库中的电子邮件 ID 时,它会显示错误:
'DoesNotExist at /forgotPassword/ UniversityDetails matching query does not exist.'

我该如何解决这个问题?

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

我还看到您将密码存储在明文中(这是一个很大的安全禁忌!).考虑使用内置的认证系统。

我也有这个问题。 这是由于开发服务器在 Aptana 调试中止后没有删除 django 会话,随后又删除了数据库。 (意味着在下一次开发服务器启动时,不存在的数据库记录的 id 仍然存在于会话中)

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

request.session.flush()

如果有人在这里,而其他两个解决方案不起作用,请检查您正在使用的过滤器是否符合您的预期:

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

电子邮件是 str还是 None? 还是 int

你可以试试这种方法。只需使用一个函数来得到你的对象

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

正如在 姜戈医生中提到的,当 get方法找不到条目或找到多个条目时,它会引发一个异常,这是预期的行为:

Get ()引发 MultipleObjectsReturn (如果有多个对象) MultipleObjectsReturn 异常是 模特班。

如果找不到对象,get ()会引发 DoesNotExist 异常 这个异常是模型的一个属性 同学们。

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

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

对空查询集执行 .first()操作时,它返回 None。这样你可以在一行中得到同样的效果。

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

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

你可以在你的情况下使用这个,它会工作得很好。

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

当数据库为空时,尝试匹配电子邮件时发生问题。所以,如果你想解决这种类型的错误,尝试把它放到 try but block 中。例如-

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