При разработке в Django часто возникает необходимость показывать настраиваемую страницу 404 с помощью кода raise Http404("Page not found.").
В этой статье мы практично рассмотрим причины возникновения ошибки 404, методы подключения шаблонов и обработку ошибок 403/500.

Иллюстрация к кастомной странице ошибки 404 для Django


1. Основные способы возникновения ошибки 404

Я классифицировал случаи возникновения ошибки 404 в Django, и, вероятно, это около четырех способов.

1. raise Http404("описание")

Это самый простой способ явно вызвать ошибку 404.

from django.http import Http404

def my_view(request):
    if not condition:
        raise Http404("Page not found.")

2. get_object_or_404()

Это часто используемая в Django сокращенная функция. Она автоматически вызывает 404, если объект отсутствует.

from django.shortcuts import get_object_or_404

post = get_object_or_404(Post, pk=pk)

3. Обработка исключений после использования Model.objects.get()

В этом случае также нужно вручную вызывать 404.

from django.http import Http404
from django.core.exceptions import ObjectDoesNotExist

try:
    post = Post.objects.get(pk=pk)
except ObjectDoesNotExist:
    raise Http404("Post not found.")

4. Когда URLConf или View не существует

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


2. Способы кастомизации

Обязательные условия

  1. Имя шаблона обязательно должно быть 404.html.
  2. В settings.py должны быть установлены следующие параметры:
  3. DEBUG = False
  4. Настройка ALLOWED_HOSTS
  5. Шаблон 404.html должен находиться в доступном Django месте.

Расположение шаблона

Место Описание
путь_проекта/templates/404.html Наиболее распространенное и надежное место
имя_приложения/templates/404.html Возможно, но требуется условие APP_DIRS = True
имя_приложения/templates/имя_приложения/errors/404.html Не обнаруживается автоматически, требуется установка handler404

handler404 пример ручного подключения

# views.py
def custom_404_view(request, exception):
    return render(request, 'myapp/errors/404.html', status=404)

# urls.py
handler404 = 'myapp.views.custom_404_view'

3. Возможно ли кастомизировать ошибки 403 и 500?

✔ Django позволяет кастомизировать страницы ошибок, помимо 404, для следующих кодов ошибок:

Код ошибки Имя шаблона по умолчанию Описание
403 403.html Отказ в доступе (Permission Denied)
404 404.html Страница не найдена (Not Found)
500 500.html Внутренняя ошибка сервера (Internal Server Error)
400 400.html Необработанный запрос (Bad Request)

✔ Основные условия те же

  • Шаблон будет применен только если DEBUG = False.
  • Шаблон должен находиться по пути TEMPLATES['DIRS'] или APP_DIRS=True.
  • При необходимости можно вручную зарегистрировать handler403, handler400, handler500 для подключения к конкретному представлению.

Подведение итогов

Элемент Содержание
При использовании raise Http404 Автоматическая отрисовка шаблона 404.html
get_object_or_404() Автоматически вызывает 404, если объект отсутствует
Имя шаблона Обязательно используйте фиксированные имена, такие как 404.html, 403.html
Условия для директории Должно находиться внутри TEMPLATES['DIRS'] или APP_DIRS
Условия DEBUG Пользовательские шаблоны применяются только при DEBUG = False
Расширенное использование Возможно подключение к конкретному представлению с помощью handler404, handler500