Al desarrollar en Django, a menudo queremos mostrar una página 404 personalizada utilizando código como raise Http404("Page not found.").
En este artículo, organizaremos de forma práctica las causas de error 404, cómo conectar plantillas y cómo manejar errores 403/500.

Ilustración de una página de error 404 personalizada para Django


1. Métodos comunes para provocar un error 404

He clasificado las situaciones en las que se produce un error 404 en Django, y creo que las siguientes 4 son las más comunes.

1. raise Http404("Descripción")

Este es el método más básico para provocar explícitamente un error 404.

from django.http import Http404

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

2. get_object_or_404()

Es una función de atajo comúnmente utilizada en Django. Provoca automáticamente un 404 si el objeto no existe.

from django.shortcuts import get_object_or_404

post = get_object_or_404(Post, pk=pk)

3. Manejo de excepciones al usar Model.objects.get()

En este caso, también debe provocar manualmente un 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. Cuando no existen URLConf o View

A diferencia de los puntos 1 a 3, no es un 404 provocado intencionalmente por el desarrollador, pero cuando una solicitud accede a una URL que no existe, Django provocará automáticamente un 404 internamente.


2. Métodos de personalización

Requisitos previos

  1. El nombre de la plantilla debe ser 404.html.
  2. En settings.py, debe estar configurado lo siguiente:
  3. DEBUG = False
  4. Se debe configurar ALLOWED_HOSTS
  5. La plantilla 404.html debe estar en una ubicación donde Django pueda encontrarla.

Ubicación de la plantilla

Ubicación Descripción
project_root/templates/404.html La ubicación más común y confiable
app_name/templates/404.html Posible, pero necesita la condición APP_DIRS = True
app_name/templates/app_name/errors/404.html No se reconoce automáticamente, es necesario configurar handler404

Ejemplo de conexión manual a través de 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. ¿Es posible personalizar errores 403 y 500?

✔ Django permite personalizar páginas de error además del 404:

Código de error Nombre de plantilla predeterminada Descripción
403 403.html Permiso denegado
404 404.html Página no encontrada
500 500.html Error interno del servidor
400 400.html Solicitud incorrecta

✔ Los requisitos básicos son los mismos

  • La plantilla se aplicará solo si DEBUG = False.
  • La plantilla debe existir en la ruta bajo TEMPLATES['DIRS'] o APP_DIRS=True.
  • Si es necesario, se pueden registrar manualmente handler403, handler400 y handler500 para conectarlos a vistas específicas.

Resumen

Elemento Contenido
Uso de raise Http404 Renderizado automático de la plantilla 404.html
get_object_or_404() Provoca automáticamente un 404 si el objeto no existe
Nombre de plantilla Debido a que se deben utilizar nombres fijos como 404.html, 403.html, etc.
Condiciones de directorio Debe estar dentro de TEMPLATES['DIRS'] o APP_DIRS
Condiciones de DEBUG La plantilla personalizada solo se aplicará cuando DEBUG = False
Uso avanzado Se pueden conectar vistas específicas con handler404, handler500, etc.