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

时间:2011-04-01 03:38:09

标签: python django django-models django-templates django-views

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

</form >

7 个答案:

答案 0 :(得分:138)

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

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

答案 1 :(得分:7)

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

要在开发过程中解决此问题,我使用了

request.session.flush()

答案 2 :(得分:1)

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

lastSpawnArrowTime = elapsedTime()

答案 3 :(得分:1)

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方法。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

在数据库为空的情况下尝试匹配电子邮件时出现问题。因此,如果您想解决此类错误,请尝试将其放入 try except 块中。例子是 -

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