2016-11-18 49 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 
...