如何在Django中的自定义404错误模板中显示传递给Http404的消息?

时间:2009-10-25 15:27:21

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

我有一个我在django工作的项目。我有很多例子:

raise Http404("this is an error")

它为我创建了一个很好的404页面,上面写着错误信息“这是一个错误”。

我现在想创建一个自定义错误页面并让它仍然显示消息,但我无法弄清楚如何。

我确定它只是我需要添加到自定义404模板的模板变量,但我找不到任何文档。

4 个答案:

答案 0 :(得分:10)

从Django 1.9开始,异常将传递到page_not_found视图,该视图在您引发Http404时运行。错误的表示形式将传递给模板,您可以将其包含在模板中:

{{ exception }}

在早期版本中,异常未传递到page_not_found视图,因此没有一种简单的方法可以在模板中包含来自异常的消息。

一种可能性是使用@Euribates在答案中建议的消息框架。另一种方法是渲染模板并在视图中返回404状态代码,而不是提升Http404

答案 1 :(得分:7)

还有另一种方式。 page_not_found处的代码使用RequestContext;这意味着您可以访问TEMPLATE_CONTEXT_PROCESSORSsettings.py条目中定义的所有上下文处理器定义的所有变量。默认值包括django 消息框架。

因此,您可以使用messages.error来定义要显示的消息,并使用messages变量在模板中显示消息。

换句话说,您可以这样写下您的观点:

from django.contrib import messages
from django.http import Http404
from django.template import RequestContext

def my_view(request):
    # your code goes here
    if something_horribly_wrong_happened():
        messages.error(request, 'Somethig horribly wrong happened!')
        raise Http404("It doesn't mind whatever you put here")
    else:
        return render_to_response(
            'template.html',
            RequestContext(request, locals()),
            )

在您的404.html模板中,您应该写一些类似的内容:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

它有点复杂,但它具有发送多条消息的优势,甚至可以使用不同类型的消息(警告,调试,信息,错误等等)。您可以阅读有关django消息框架的更多信息在这里:The messages framework | Django Documentation

答案 2 :(得分:1)

我有更简单的解决方案

只需编写中间件,即可将错误文本转换为某个请求变量。见例子

from django.http.response import Http404

class Error404Middleware(object):
    def process_exception(self, request, exception):
        if isinstance(exception, Http404):
            request.error_404_message = exception.message

在404.html

{{ request.error_404_message }}

答案 3 :(得分:1)

<强> {{ exception }}

从1.9.6开始,消息传递给:

raise Http404('msg')

可从templates/404.html获取:

{{ exception }}

来源:https://github.com/django/django/blob/1.9.6/django/views/defaults.py#L20