diff --git a/django/template/loader.py b/django/template/loader.py index 2fc1a7a3aa..98eddf24f2 100644 --- a/django/template/loader.py +++ b/django/template/loader.py @@ -191,12 +191,15 @@ def render_to_string(template_name, dictionary=None, context_instance=None): def select_template(template_name_list): "Given a list of template names, returns the first that can be loaded." + not_found = [] for template_name in template_name_list: try: return get_template(template_name) - except TemplateDoesNotExist: + except TemplateDoesNotExist, e: + if e.args[0] not in not_found: + not_found.append(e.args[0]) continue # If we get here, none of the templates could be loaded - raise TemplateDoesNotExist(', '.join(template_name_list)) + raise TemplateDoesNotExist(', '.join(not_found)) add_to_builtins('django.template.loader_tags') diff --git a/tests/regressiontests/templates/templates/test_include_error.html b/tests/regressiontests/templates/templates/test_include_error.html new file mode 100644 index 0000000000..6db959380e --- /dev/null +++ b/tests/regressiontests/templates/templates/test_include_error.html @@ -0,0 +1 @@ +{% include "missing.html" %} \ No newline at end of file diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index fb47b27d90..c99081932a 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -237,6 +237,38 @@ class Templates(unittest.TestCase): loader.template_source_loaders = old_loaders settings.TEMPLATE_DEBUG = old_td + + def test_include_missing_template(self): + """ + Tests that the correct template is identified as not existing + when {% include %} specifies a template that does not exist. + """ + + # TEMPLATE_DEBUG must be true, otherwise the exception raised + # during {% include %} processing will be suppressed. + old_td, settings.TEMPLATE_DEBUG = settings.TEMPLATE_DEBUG, True + old_loaders = loader.template_source_loaders + + try: + # Test the base loader class via the app loader. load_template + # from base is used by all shipped loaders excepting cached, + # which has its own test. + loader.template_source_loaders = (app_directories.Loader(),) + + load_name = 'test_include_error.html' + r = None + try: + tmpl = loader.select_template([load_name]) + r = tmpl.render(template.Context({})) + except template.TemplateDoesNotExist, e: + settings.TEMPLATE_DEBUG = old_td + self.assertEqual(e.args[0], 'missing.html') + self.assertEqual(r, None, 'Template rendering unexpectedly succeeded, produced: ->%r<-' % r) + finally: + loader.template_source_loaders = old_loaders + settings.TEMPLATE_DEBUG = old_td + + def test_extends_include_missing_baseloader(self): """ Tests that the correct template is identified as not existing