繁体   English   中英

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

[英]matching query does not exist Error in Django

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

我该如何解决这个问题?

忘记密码.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

我还看到您以明文形式存储密码(一个很大的安全禁忌!)。 考虑改用内置的身份验证系统。

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

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

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

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

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

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

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

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

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

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

request.session.flush()

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

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

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

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

email 是str还是None int

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM