Django

Error 404 personalizado Django

Este tutorial es simple, como crear nuestro propio error 404 en nuestro proyecto Django, generalmente Django no ofrece algo como esto una vez intentamos acceder a una url no existente.
Error_response

No es que este error este mal, pero en ocaciones queremos tener algo mas que simplemente un error por defecto, si no algo mas elegante como el 404 de github.

Page_not_found_·_GitHub

En fin, mano a la obra.

Para lograr algo como esto, se puede lograr de varias formas, la primera y mas facil es crear un archivo con el nombre 404.html en nuestro directorio donde colocamos nuestros templates.

404_html_—_tropical-html__Sign_-_Up__Password_reset_-_any_message__mysite

Ejemplo de 404

See the Pen 404 Page pure CSS by Ed Bond (@edbond88) on CodePen.

La otra forma de hacerlo es sobre escribiendo el «handler» del error 404 en nuestro archivo urls.py, ojo no me refiero al archivo de nuestra aplicacion si no al del projecto.

En su archivo de views.py de su aplicacion crear esta vista

from django.views.defaults import page_not_found

def mi_error_404(request):
    nombre_template = '404.html'

    return page_not_found(request, template_name=nombre_template)

En el archivo url.py del projecto

from django.conf.urls import handler404
from app_name.views import mi_error_404

handler404 = mi_error_404

Echo esto ya tendremos nuestro error 404 personalizado. Ahora pensaras por que tomar el segundo paso y no el primero, bueno si tienes mas de una aplicacion en el mismo projecto posiblemente quieras tener varios errores 404, una forma de lograr esto seria en base al patron de la url que esta llegando el error, algo como esto:

def mi_error_404(request):
    nombre_template = '404.html'

    if request.path.startswith('/app1'):
        nombre_template = 'app1_404.html'
    elif request.path.startswith('/app2'):
        nombre_template = 'app2_404.html'

    return page_not_found(request, template_name=nombre_template)

Para los demas errores la tematica es la misma, colocar un template con el codigo del error, o sobre escribir el handler de ese error en el url.py

Espero les sirva de algo al igual que me sirvió a mi.