From 8625c7aab3760d16572792fea23a95e572e28ead Mon Sep 17 00:00:00 2001 From: Preston Timmons Date: Fri, 30 Aug 2013 14:08:40 -0500 Subject: [PATCH] Fixed #16096 -- Added origin attribute to template instances. Thanks jdunck for the suggestion. --- django/template/base.py | 1 + docs/ref/templates/api.txt | 37 ++++++++++++++++++++++++++++++++++- docs/releases/1.7.txt | 4 ++++ tests/template_tests/tests.py | 13 ++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/django/template/base.py b/django/template/base.py index 67af5b17f8..1f3c250362 100644 --- a/django/template/base.py +++ b/django/template/base.py @@ -124,6 +124,7 @@ class Template(object): origin = StringOrigin(template_string) self.nodelist = compile_string(template_string, origin) self.name = name + self.origin = origin def __iter__(self): for node in self.nodelist: diff --git a/docs/ref/templates/api.txt b/docs/ref/templates/api.txt index 05f8c249c5..b0fc94040a 100644 --- a/docs/ref/templates/api.txt +++ b/docs/ref/templates/api.txt @@ -759,10 +759,45 @@ Django uses the template loaders in order according to the :setting:`TEMPLATE_LOADERS` setting. It uses each loader until a loader finds a match. +.. currentmodule:: django.template + +Template origin +~~~~~~~~~~~~~~~ + +.. versionadded:: 1.7 + +When :setting:`TEMPLATE_DEBUG` is ``True`` template objects will have an +``origin`` attribute depending on the source they are loaded from. + +.. class:: loader.LoaderOrigin + + Templates created from a template loader will use the + ``django.template.loader.LoaderOrigin`` class. + + .. attribute:: name + + The path to the template as returned by the template loader. + For loaders that read from the file system, this is the full + path to the template. + + .. attribute:: loadname + + The relative path to the template as passed into the + template loader. + +.. class:: StringOrigin + + Templates created from a ``Template`` class will use the + ``django.template.StringOrigin`` class. + + .. attribute:: source + + The string used to create the template. + The ``render_to_string`` shortcut =================================== -.. function:: django.template.loader.render_to_string(template_name, dictionary=None, context_instance=None) +.. function:: loader.render_to_string(template_name, dictionary=None, context_instance=None) To cut down on the repetitive nature of loading and rendering templates, Django provides a shortcut function which largely diff --git a/docs/releases/1.7.txt b/docs/releases/1.7.txt index aa68b722b6..1390317875 100644 --- a/docs/releases/1.7.txt +++ b/docs/releases/1.7.txt @@ -272,6 +272,10 @@ Templates * It is now possible to :ttag:`include` templates recursively. +* Template objects now have an origin attribute set when + :setting:`TEMPLATE_DEBUG` is ``True``. This allows template origins to be + inspected and logged outside of the ``django.template`` infrastructure. + Backwards incompatible changes in 1.7 ===================================== diff --git a/tests/template_tests/tests.py b/tests/template_tests/tests.py index 5897a3e83a..cf294c2280 100644 --- a/tests/template_tests/tests.py +++ b/tests/template_tests/tests.py @@ -236,6 +236,19 @@ class TemplateLoaderTests(TestCase): loader.template_source_loaders = old_loaders settings.TEMPLATE_DEBUG = old_td + def test_loader_origin(self): + with self.settings(TEMPLATE_DEBUG=True): + template = loader.get_template('login.html') + self.assertEqual(template.origin.loadname, 'login.html') + + def test_string_origin(self): + with self.settings(TEMPLATE_DEBUG=True): + template = Template('string template') + self.assertEqual(template.origin.source, 'string template') + + def test_debug_false_origin(self): + template = loader.get_template('login.html') + self.assertEqual(template.origin, None) def test_include_missing_template(self): """