如何使用get_object_or_404显示个性化错误

时间:2010-07-14 04:54:11

标签: django django-templates http-status-code-404

我想知道如何用get_object_or_404显示个性化错误?,我不想要正常的http404页面,我想显示一条消息,结果是无

谢谢:)

4 个答案:

答案 0 :(得分:15)

get_object_or_404()本质上是一个简单的5行函数。除非您有特定的理由使用它,否则请执行以下操作:

try:
    instance = YourModel.objects.get(pk=something)
except YourModel.DoesNotExist:
    return render_to_response('a_template_with_your_error_message.html')

如果无论出于什么原因你 使用get_object_or_404(),你可以尝试将它放在try: ... except Http404: ...块中,但老实说,我不能想到一个合理的理由。

答案 1 :(得分:3)

正如michael所述,当使用get_object_or_404时,您无法自定义http 404上给出的消息.DEBUG中提供的消息确实提供了有关异常的信息:“没有MyModel匹配给定的查询。”

在此查看doc。有三个参数:Model,* args和** kwargs。最后两个用于在Model上为get()或filter()构建一个参数。

然而,我编写的原因是为了解决为什么我们要使用辅助函数(例如get_object_or_404()而不是像使用Model.DoesNotExist这样的异常来捕获它的问题。

后一种解决方案将视图层耦合到模型层。为了放松这种耦合,我们可以利用django.shortcuts模块[1]中提供的受控耦合。

答案 2 :(得分:2)

不能用那条捷径来完成。它只能引发Http404异常。如果你想要完全控制,你最好的选择是试试。例如

try:
    obj = Model.objects.get(pk = foo)
except:
    return HttpResponseRedirect('/no/foo/for/you')
    #or
    return render_to_response ...

答案 3 :(得分:2)

为什么你没有使用服务器的可靠性来做到这一点? get_object_or_404()是否重定向到默认的404页面?
如果您处于调试模式,您将看不到它,但在部署时,django将仅引用服务器的404 html页面。