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

StackOverflow https://stackoverflow.com/questions/1621173

Вопрос

У меня есть проект, над которым я работаю в 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 . Значение по умолчанию включает, среди прочего, структуру messages 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 .

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

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

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

{{исключение}}

Начиная с 1.9.6, сообщение было передано:

raise Http404('msg')

доступен из templates / 404.html как:

{{ exception }}

Источник: https: // github. ком / Джанго / Джанго / BLOB / 1.9.6 / Джанго / просмотров / defaults.py # L20

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top