This way, You fools!
Blog About Projects
How to override error pages in Django?
How to override error pages in Django?

Introduction

Overriding error pages in your web application or web site 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 of all, 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.