【问题标题】:how show personalized error with get_object_or_404如何使用 get_object_or_404 显示个性化错误
【发布时间】:2011-03-15 16:20:44
【问题描述】:

我想知道如何使用get_object_or_404 方法显示个性化错误。我不想要普通的 Http404 页面,但我想显示一条带有消息的自定义消息:结果为 none。

谢谢:)

【问题讨论】:

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


    【解决方案1】:

    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: ... 块中,但老实说,我想不出一个合理的理由。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        您为什么不使用您的服务器的能力来做到这一点?
        get_object_or_404() 正在重定向到默认的 404 页面,对吗?
        如果您处于调试模式,您将看不到它,但部署 django 时只会引用服务器的 404 html 页面。

        【讨论】:

          【解决方案4】:

          使用该快捷方式无法做到这一点。它只会引发 Http404 异常。如果您想完全控制,最好的选择是try catch。例如。

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

          【讨论】:

            猜你喜欢
            • 2016-04-07
            • 1970-01-01
            • 1970-01-01
            • 2011-03-04
            • 1970-01-01
            • 1970-01-01
            • 2014-08-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多