Подтвердить что ты не робот

Как отобразить сообщение, переданное Http404 в пользовательском шаблоне ошибки 404 в Django?

У меня есть проект, над которым я работаю в django. Существует много случаев, когда I:

raise Http404("this is an error")

и для меня создается хорошая страница 404 с сообщением об ошибке "это ошибка".

Теперь я хочу создать собственную страницу с ошибкой и показать ее, но я не могу понять, как это сделать.

Я уверен, что это просто переменная шаблона, которую мне нужно добавить в свой собственный шаблон 404, но я не могу найти для него никакой документации.

4b9b3361

Ответ 1

По состоянию на Django 1.9 исключение передается в page_not_found, которое запускается при повышении Http404. Представление ошибки передается шаблону, вы можете включить его в свой шаблон с помощью:

{{ exception }}

В более ранних версиях исключение не было передано в представление page_not_found, поэтому не было простого способа включить сообщение из исключения в шаблон.

Одна из возможностей заключалась в том, чтобы использовать структуру сообщений, как предлагает @Euribates в своем ответе. Другим было создание шаблона и возврат кода статуса 404 на ваш взгляд вместо повышения Http404.

Ответ 2

Есть и другой способ. Код 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 здесь: Структура сообщений | Документация Django.

Ответ 3

У меня есть более простое решение

Просто напишите промежуточное программное обеспечение, которое примет текст ошибки в некоторой переменной запроса. См. Пример

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 }}