【发布时间】:2011-03-15 16:20:44
【问题描述】:
我想知道如何使用get_object_or_404 方法显示个性化错误。我不想要普通的 Http404 页面,但我想显示一条带有消息的自定义消息:结果为 none。
谢谢:)
【问题讨论】:
标签: django django-templates http-status-code-404
我想知道如何使用get_object_or_404 方法显示个性化错误。我不想要普通的 Http404 页面,但我想显示一条带有消息的自定义消息:结果为 none。
谢谢:)
【问题讨论】:
标签: django django-templates http-status-code-404
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: ... 块中,但老实说,我想不出一个合理的理由。
【讨论】:
正如 michael 所说,使用 get_object_or_404 时,您无法自定义在 http 404 上给出的消息。DEBUG 中提供的消息确实提供了有关异常的信息:“没有 MyModel 与给定的查询匹配。”
在此查看doc。共有三个参数:Model、*args 和 **kwargs。最后两个用于在模型上为 get() 或 filter() 构建参数。
然而,我写这篇文章的原因是为了解决我们为什么要使用诸如 get_object_or_404() 之类的辅助函数而不是用诸如 Model.DoesNotExist 之类的异常来捕获它的问题。
后面的解决方案将视图层耦合到模型层。为了放松这种耦合,我们可以利用 django.shortcuts 模块[1] 中提供的受控耦合。
【讨论】:
您为什么不使用您的服务器的能力来做到这一点?get_object_or_404() 正在重定向到默认的 404 页面,对吗?
如果您处于调试模式,您将看不到它,但部署 django 时只会引用服务器的 404 html 页面。
【讨论】:
使用该快捷方式无法做到这一点。它只会引发 Http404 异常。如果您想完全控制,最好的选择是try catch。例如。
try:
obj = Model.objects.get(pk = foo)
except:
return HttpResponseRedirect('/no/foo/for/you')
#or
return render_to_response ...
【讨论】: