Как отобразить сообщение, переданное Http404 в пользовательском шаблоне ошибки 404 в Django?
У меня есть проект, над которым я работаю в Django. Есть много случаев, когда я:
raise Http404("this is an error")
и он создает для меня симпатичную страницу 404 с сообщением об ошибке "это ошибка".
Теперь я хочу создать пользовательскую страницу ошибки и по-прежнему отображать сообщение, но не могу понять, как это сделать.
Я уверен, что это просто переменная шаблона, которую мне нужно добавить в свой пользовательский шаблон 404, но я не могу найти никакой документации для него.
4 ответа
Начиная с 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 %}
Это немного сложнее, но у него есть то преимущество, что вы можете отправлять несколько сообщений и даже использовать сообщения различного типа (Предупреждение, Отладка, Информация, Ошибка и т. Д.). Подробнее об инфраструктуре сообщений 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