2016-01-08 113 views
-1

我有一個Django應用程序,用於檢查數據庫是否包含與表單中用戶輸入的數字相匹配的數字。我設法讓它重定向到'你贏'頁面,如果它們匹配但是當它們不匹配時它只會給出'匹配查詢不存在'的錯誤。下面是我使用的view.py文件中的if/else語句:Django模型`get`不返回false

if Numbers.objects.get(numbers_win = user_number): 
    return HttpResponseRedirect('win') 
else: 
    return HttpResponseRedirect('lose.html') 
+1

'Numbers.object.get..'返回什麼?你確定它返回一個布爾值嗎? – Mel

+2

也許這將有助於:http://stackoverflow.com/questions/3090302/in-django-how-do-i-objects-get-but-return-none-when-nothing-is-found所以,你將不得不用try來包圍它,除了if以外。 – allu

回答

2

這是因爲.get拋出時,有沒有匹配的例外 - 它不返回東西falsey。

你有兩個選擇:

首先,你可以使用filterexists代替get,如果事情被發現,這將返回TrueFalse否則。

如果你不以其他方式使用的結果,這可能是最好的解決辦法:

if Numbers.objects.filter(numbers_win = user_number).exists(): 
    return HttpResponseRedirect('win') 
else: 
    return HttpResponseRedirect('lose.html') 

(正如在評論中指出,using exists is faster if you're just checking for existence

其次,你捕獲異常而不是使用if/else

try: 
    Numbers.objects.get(numbers_win = user_number) 
except Numbers. DoesNotExist: 
    return HttpResponseRedirect('lose.html') 
else: 
    return HttpResponseRedirect('win') 

正如你所看到的,儘管如此,這會讓代碼有些尷尬,並且它也比使用.exists差,所以你可能不應該這樣做。

+0

實際上,OP應該使用'.filter(...)。exists()',如果他們想要做的就是驗證該項目是否在數據庫中。 –

+0

謝謝@DanielRoseman;更正 –

+0

如果您將get調用的結果分配給一個變量並在else語句中使用,它可能會更好,這可能是用戶想要執行的操作。 – jpic