Django display 404 on missing template
If you want this behaviour for all views on your site, you might want to write your own middleware with a process_exception
method.
from django.template import TemplateDoesNotExistfrom django.views.defaults import page_not_foundclass TemplateDoesNotExistMiddleware(object): """ If this is enabled, the middleware will catch TemplateDoesNotExist exceptions, and return a 404 response. """ def process_exception(self, request, exception): if isinstance(exception, TemplateDoesNotExist): return page_not_found(request)
If you have defined your own handler404
you would need to replace page_not_found
above. I'm not immediately sure how you could convert the string handler404
into the callable required in the middleware..
To enable your middleware, add it to MIDDLEWARE_CLASSES
in settings.py
. Be careful of the position where you add it. The standard Django middleware warning applies:
Again, middleware are run in reverse order during the response phase, which includes process_exception. If an exception middleware returns a response, the middleware classes above that middleware will not be called at all.
put the return of the response in the view (or whereever the template is rendered) in a try-except block:
from django.http import Http404from django.shortcuts import render_to_responsefrom django.template import TemplateDoesNotExistdef the_view(request): ... try: return render_to_response(...) except TemplateDoesNotExist: raise Http404
Off the top of my head, but if you set DEBUG=False in your settings, won't you get a 404 then on every error (including TemplateNotFound)?