簡體   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