summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/template/base.py8
-rw-r--r--docs/releases/1.9.2.txt7
-rw-r--r--tests/template_tests/tests.py9
3 files changed, 22 insertions, 2 deletions
diff --git a/django/template/base.py b/django/template/base.py
index ce2c970378..50b55f4b69 100644
--- a/django/template/base.py
+++ b/django/template/base.py
@@ -225,6 +225,7 @@ class Template(object):
tokens = lexer.tokenize()
parser = Parser(
tokens, self.engine.template_libraries, self.engine.template_builtins,
+ self.origin,
)
try:
@@ -445,7 +446,7 @@ class DebugLexer(Lexer):
class Parser(object):
- def __init__(self, tokens, libraries=None, builtins=None):
+ def __init__(self, tokens, libraries=None, builtins=None, origin=None):
self.tokens = tokens
self.tags = {}
self.filters = {}
@@ -459,6 +460,7 @@ class Parser(object):
self.libraries = libraries
for builtin in builtins:
self.add_library(builtin)
+ self.origin = origin
def parse(self, parse_until=None):
"""
@@ -535,8 +537,10 @@ class Parser(object):
)
if isinstance(nodelist, NodeList) and not isinstance(node, TextNode):
nodelist.contains_nontext = True
- # Set token here since we can't modify the node __init__ method
+ # Set origin and token here since we can't modify the node __init__()
+ # method.
node.token = token
+ node.origin = self.origin
nodelist.append(node)
def error(self, token, e):
diff --git a/docs/releases/1.9.2.txt b/docs/releases/1.9.2.txt
index 1612a938a2..30527c146a 100644
--- a/docs/releases/1.9.2.txt
+++ b/docs/releases/1.9.2.txt
@@ -75,3 +75,10 @@ Bugfixes
* Fixed a crash when calling the ``migrate`` command in a test case with the
``available_apps`` attribute pointing to an application with migrations
disabled using the ``MIGRATION_MODULES`` setting (:ticket:`26135`).
+
+* Restored the ability for testing and debugging tools to determine the
+ template from which a node came from, even during template inheritance or
+ inclusion. Prior to Django 1.9, debugging tools could access the template
+ origin from the node via ``Node.token.source[0]``. This was an undocumented,
+ private API. The origin is now available directly on each node using the
+ ``Node.origin`` attribute (:ticket:`25848`).
diff --git a/tests/template_tests/tests.py b/tests/template_tests/tests.py
index 43cc182008..ff0b29073f 100644
--- a/tests/template_tests/tests.py
+++ b/tests/template_tests/tests.py
@@ -140,3 +140,12 @@ class TemplateTests(SimpleTestCase):
child = engine.from_string(
'{% extends parent %}{% block content %}child{% endblock %}')
self.assertEqual(child.render(Context({'parent': parent})), 'child')
+
+ def test_node_origin(self):
+ """
+ #25848 -- Set origin on Node so debugging tools can determine which
+ template the node came from even if extending or including templates.
+ """
+ template = Engine().from_string('content')
+ for node in template.nodelist:
+ self.assertEqual(node.origin, template.origin)