【问题标题】:matching query does not exist Error in Django匹配的查询不存在 Django 中的错误
【发布时间】:2011-07-27 09:42:17
【问题描述】:

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

我该如何解决这个问题?

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 >

【问题讨论】:

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


    【解决方案1】:
    try:
        user = UniversityDetails.objects.get(email=email)
    except UniversityDetails.DoesNotExist:
        user = None
    

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

    【讨论】:

      【解决方案2】:

      正如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 上添加的。

      【讨论】:

      • 不能在十进制字段上使用它。引发错误:'decimal.Decimal' 对象没有属性 'first'。
      • 你应该在QuerySet@user12379095上使用这个方法
      • 不!即使在 qs 上也不会发生。
      【解决方案3】:

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

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

      request.session.flush()
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          如果有人在这里,而其他两种解决方案无法奏效,请检查您用于过滤的内容是否符合您的预期:

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 2013-07-22
                • 2021-12-26
                • 2015-04-20
                • 2021-07-26
                • 1970-01-01
                • 1970-01-01
                • 2022-01-19
                • 1970-01-01
                相关资源
                最近更新 更多