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

rv_*_*v_k 54 python django django-templates django-models 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')
Run Code Online (Sandbox Code Playgroud)

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 >
Run Code Online (Sandbox Code Playgroud)

Sam*_*lan 144

try:
    user = UniversityDetails.objects.get(email=email)
except UniversityDetails.DoesNotExist:
    user = None
Run Code Online (Sandbox Code Playgroud)

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

  • 正是我在寻找的!谢谢sdolan! (4认同)

Mar*_*nte 11

正如Django 文档中提到的,当get方法没有找到条目或找到多个条目时,它会引发异常,这是预期的行为:

如果找到多个对象,get() 会引发 MultipleObjectsReturned。MultipleObjectsReturned 异常是模型类的一个属性。

如果没有找到给定参数的对象,get() 会引发一个DoesNotExist 异常。这个异常是模型类的一个属性。

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

user = UniversityDetails.objects.filter(email=email).first()
Run Code Online (Sandbox Code Playgroud)

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

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

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


Rob*_*bse 7

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

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

request.session.flush()
Run Code Online (Sandbox Code Playgroud)