BackBack

How to override error pages in Django?

How to override error pages in Django?
/ by Majid / 2 Minutes

Introduction

Overriding error pages in your web application or website is a very useful feature because of giving a good experience to users and let you lead users to the proper page after seeing the error also improve your site SEO rate. So let see how to override these pages in Django projects.


Note This tutorial based on Django 2.*

Step 1 - Preparing Templates

OK, First, we need to create our templates. By default, Django serves 4 templates for bad requests (400), permission denied (403), not found (404) and server error (500) errors, so we must override this template to use our customized pages. You can design your pages on your way then put those in this path:

your_project_root/your_app_name/templates/your_app_name/errors/

Step 2 - Preparing Views

Next, put this code in your views.py file:

views.py

. . .

from Django.views import defaults

ERROR_400_TEMPLATE_NAME = 'errors/error_400.html'
ERROR_403_TEMPLATE_NAME = 'errors/error_403.html'
ERROR_404_TEMPLATE_NAME = 'errors/error_404.html'
ERROR_500_TEMPLATE_NAME = 'errors/error_500.html'


def bad_request(request, exception, template_name=ERROR_400_TEMPLATE_NAME):
    return defaults.bad_request(request, exception, template_name)


def permission_denied(request, exception, template_name=ERROR_403_TEMPLATE_NAME):
    return defaults.permission_denied(request, exception, template_name)


def page_not_found(request, exception, template_name=ERROR_404_TEMPLATE_NAME):
    return defaults.page_not_found(request, exception, template_name)


def server_error(request, template_name=ERROR_500_TEMPLATE_NAME):
    return defaults.server_error(request, template_name)

. . .

Django by default define one function for each error and pass the template name to it.

Step 3 - Preparing URLs

In this step, we must declare our views in urls.py file. In urls.py override default error handlers to use our views.

Important note You must do the alteration in project level URLs.

urls.py

from django.contrib import admin
from django.urls import path
from my_app import views

urlpatterns = [
    path('admin/', admin.site.urls)
]

handler400 = views.bad_request
handler403 = views.permission_denied
handler404 = views.page_not_found
handler500 = views.server_error

Step 4 - Preparing Settings

Very well, the last step is to change the settings to see the result. You must deactivate DEBUG mode and add your host to ALLOWED_HOSTS, so do it:

settings.py

DEBUG = False

ALLOWED_HOSTS = [‘localhost’, ‘127.0.0.1’]

OK, for testing the changes, make a fake error, for example, an incorrect URL and see changes.

Conclusion

It’s really simple but so important to display proper page to users. It gives a good feeling to them and makes a good user experience.