2016-11-18 89 views
0

目前,如果找不到項目,則會引發404。 我想要做的是讓URL做檢查,但如果輸入project.id不存在,則保持在同一頁面上。Django:優雅的方式來處理缺失的ID不是404()

def show(request, pk): 
try: 
    project = Project.objects.filter(
     pk=pk, 
     source_language=source_language, 
     target_languages__in=[target_language] 
    ).first() 
except Exception as e: 
    raise Http404() 
if not project: 
    #instead of this do what? print message no project, return to previous page 
    raise Http404() 
    #return HttpResponseRedirect(request.META.get('HTTP_REFERER')) still generates error from non URL match 

回答

2

首先,您的當前代碼有幾個問題。 filter(...).first()絕不會引發異常,所以沒有理由去捕捉它;即使這樣做了,也不應該捕獲基類Exception類。相反,您應該使用Project.objects.get(...)並捕獲Project.DoesNotExist。

所以,如果你想吞下該錯誤,你可以返回一個重定向到你想要的頁面;此外,您可以使用messages framework向用戶添加消息。

from django.contrib import messages 
try: 
    project = Project.objects.get(
     pk=pk, 
     source_language=source_language, 
     target_languages__in=[target_language] 
    ) 
except Project.DoesNotExist: 
    messages.warning(request, 'That project does not exist.') 
    return redirect('index') # or wherver 
... 
相關問題