From 8890c533e0b53cb0021bd5faf15668430cd3075a Mon Sep 17 00:00:00 2001 From: Ivan Tsouvarev Date: Fri, 26 Feb 2016 09:49:02 +0300 Subject: [PATCH] Fixed #26280 -- Fixed cached template loader crash when loading nonexistent template. --- django/template/loaders/cached.py | 2 +- docs/releases/1.9.3.txt | 3 +++ tests/template_tests/test_loaders.py | 12 ++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/django/template/loaders/cached.py b/django/template/loaders/cached.py index c13346b9612..5bf5c10586c 100644 --- a/django/template/loaders/cached.py +++ b/django/template/loaders/cached.py @@ -131,7 +131,7 @@ class Loader(BaseLoader): template_tuple = self.template_cache.get(key) # A cached previous failure: if template_tuple is TemplateDoesNotExist: - raise TemplateDoesNotExist + raise TemplateDoesNotExist(template_name) elif template_tuple is None: template, origin = self.find_template(template_name, template_dirs) if not hasattr(template, 'render'): diff --git a/docs/releases/1.9.3.txt b/docs/releases/1.9.3.txt index ef956810242..625899daa02 100644 --- a/docs/releases/1.9.3.txt +++ b/docs/releases/1.9.3.txt @@ -46,3 +46,6 @@ Bugfixes * Changed the admin's "permission denied" message in the login template to use ``get_username`` instead of ``username`` to support custom user models (:ticket:`26231`). + +* Fixed a crash when passing a nonexistent template name to the cached template + loader's ``load_template()`` method (:ticket:`26280`). diff --git a/tests/template_tests/test_loaders.py b/tests/template_tests/test_loaders.py index 36147935649..11f20c6debf 100644 --- a/tests/template_tests/test_loaders.py +++ b/tests/template_tests/test_loaders.py @@ -87,6 +87,18 @@ class CachedLoaderTests(SimpleTestCase): "Cached loader failed to cache the TemplateDoesNotExist exception", ) + @ignore_warnings(category=RemovedInDjango20Warning) + def test_load_nonexistent_cached_template(self): + loader = self.engine.template_loaders[0] + template_name = 'nonexistent.html' + + # fill the template cache + with self.assertRaises(TemplateDoesNotExist): + loader.find_template(template_name) + + with self.assertRaisesMessage(TemplateDoesNotExist, template_name): + loader.get_template(template_name) + def test_templatedir_caching(self): """ #13573 -- Template directories should be part of the cache key.