我有我在Django工作的一个项目。 有很多情况下,在那里我:
raise Http404("this is an error")
它为我创造一个很好的404页面错误消息“这是一个错误”写在上面。
我现在想创建一个自定义错误页,并有它仍然显示该消息,但我无法弄清楚如何。
我敢肯定,这只是一个模板变量,我需要添加到我的自定义模板404,但我找不到它的任何文件。
我有我在Django工作的一个项目。 有很多情况下,在那里我:
raise Http404("this is an error")
它为我创造一个很好的404页面错误消息“这是一个错误”写在上面。
我现在想创建一个自定义错误页,并有它仍然显示该消息,但我无法弄清楚如何。
我敢肯定,这只是一个模板变量,我需要添加到我的自定义模板404,但我找不到它的任何文件。
由于Django的1.9,异常被传递给page_not_found
,当你提高运行图Http404
。 错误的表示被传递到模板,可以将其包含在您的模板:
{{ exception }}
在早期版本中,异常没有被传递给page_not_found
看法,所以有没有一种简单的方法,包括从模板异常的消息。
一种可能性是为@Euribates表明自己回答使用消息框架。 另一种是呈现模板,并在您的视图返回反而提高了404个状态码, Http404
。
还有另一种方法。 在代码page_not_found
使用RequestContext
; 这意味着你有机会获得由定义的所有上下文处理器定义的所有变量TEMPLATE_CONTEXT_PROCESSORS
在进入settings.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 %}
这是一个有点复杂,但它的优势在于,您可以发送几个消息,甚至使用diferent类型的消息(警告,调试,信息,错误等),您可以在此处详细了解Django的消息框架: 将消息框架| Django文档 。
我有简单的解决方案
只要写的中间件,这将需要你的错误的文字到一些请求变量。 查看范例
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 }}
{{ 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