Custom 404 Not Found page with Django CMS…
… or how to make user editable 404 page that stays in the pages tree of the CMS
Basics: Yes you need it! You need 404 page cause you never know what may happen to a link: bad link paste, obsolete or deleted article, someone just playing with your URLs etc. It is better for both you and your website visitors to have a beauty page that follows the website design instead of the webserver default one that usually contains server information which is possible security issue. With Django this is easy, just make a HTML template with file name 404.html, place it in you root template directory and voilà – you are ready. You will also automatically have a request_path variable defined in the context which caries the URL that was not found.
Problem: sometimes clients require to be able to edit their 404 pages. Or other times you need to use some custom context or you want to integrate plug-ins and be able to modify them easy trough the CMS administration. For example: you want do display your brand new awesome “Sitemap Plug-in” on this 404 page.
Solution: Django allows you to specify custom 404 handler view so you just need to define one, set it in urls.py and make it to render the wanted page:
# in urls.py handler404 = 'site_utils.handler404' # in site_utils.py from cms.views import details def handler404(request): return details(request, '404-page-url')
Where ’404-page-url’ is the URL of the page you want to show for 404 errors. So everything seems fine and here is the pitfall. If you use it this way your web page will return “200 OK” instead of “404 Not Found”. This could kill your SEO(except if you want your 404 page as first result for your website). So you just need to add a 404 header to the response:
def handler404(request): response = details(request, 'novini') response.status_code = 404 return response
Final words: Why are these HTTP status codes so important. The reason is that they tells the search engines and other auto crawling services what is the page status. Is it normal page, redirect, not found, error or something else. Providing incorrect status codes may/will have a negative effect on your website SEO so try to keep them correct, especially when it is easy to achieve as in the example above.
Note: If the code above is not working for you, please check Allan’s solution in the comments
- Django for Web Prototyping
- Automation, Fabric and Django – presentation
- Django project file structure
- Automated deployment with Ubuntu, Fabric and Django
- Django compressor and image preloading
- Fabric & Django
- HTTP Status Codes Site
- Connecting Django Models with outer applications
- Django CMS Plugins with selectable template …
- Language redirects for multilingual sites with Django CMS …