summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2017-03-25 08:22:12 -0400
committerTim Graham <timograham@gmail.com>2017-03-25 08:22:31 -0400
commit8cc2f5aed186f8b83bfac240b2a1480bd0c11e4f (patch)
tree60471d6782f8aed2142199dfd2bcf34252866bbc
parentb6a6787fd857813801dbcd63ac6672da355af998 (diff)
[1.11.x] Fixed #27956 -- Fixed display of errors in an {% extends %} child.
Thanks Ling-Xiao Yang for the report and test, and Preston Timmons for the fix. Backport of e643ba8bcf0b1da517cbab689ac157ee031202a3 from master
-rw-r--r--django/template/context.py8
-rw-r--r--django/template/loader_tags.py3
-rw-r--r--tests/template_tests/templates/27956_child.html3
-rw-r--r--tests/template_tests/templates/27956_parent.html5
-rw-r--r--tests/template_tests/tests.py12
5 files changed, 27 insertions, 4 deletions
diff --git a/django/template/context.py b/django/template/context.py
index 166f60fe75..7f0826c644 100644
--- a/django/template/context.py
+++ b/django/template/context.py
@@ -215,15 +215,17 @@ class RenderContext(BaseContext):
return self.dicts[-1][key]
@contextmanager
- def push_state(self, template):
+ def push_state(self, template, isolated_context=True):
initial = self.template
self.template = template
- self.push()
+ if isolated_context:
+ self.push()
try:
yield
finally:
self.template = initial
- self.pop()
+ if isolated_context:
+ self.pop()
class RequestContext(Context):
diff --git a/django/template/loader_tags.py b/django/template/loader_tags.py
index 4ff5ec4db5..020f2e412a 100644
--- a/django/template/loader_tags.py
+++ b/django/template/loader_tags.py
@@ -173,7 +173,8 @@ class ExtendsNode(Node):
# Call Template._render explicitly so the parser context stays
# the same.
- return compiled_parent._render(context)
+ with context.render_context.push_state(compiled_parent, isolated_context=False):
+ return compiled_parent._render(context)
class IncludeNode(Node):
diff --git a/tests/template_tests/templates/27956_child.html b/tests/template_tests/templates/27956_child.html
new file mode 100644
index 0000000000..ea9aeb2197
--- /dev/null
+++ b/tests/template_tests/templates/27956_child.html
@@ -0,0 +1,3 @@
+{% extends "27956_parent.html" %}
+
+{% block content %}{% endblock %}
diff --git a/tests/template_tests/templates/27956_parent.html b/tests/template_tests/templates/27956_parent.html
new file mode 100644
index 0000000000..dad4fbbfe5
--- /dev/null
+++ b/tests/template_tests/templates/27956_parent.html
@@ -0,0 +1,5 @@
+{% load tag_27584 %}
+
+{% badtag %}{% endbadtag %}
+
+{% block content %}{% endblock %}
diff --git a/tests/template_tests/tests.py b/tests/template_tests/tests.py
index 50ddee6674..4ec724db99 100644
--- a/tests/template_tests/tests.py
+++ b/tests/template_tests/tests.py
@@ -125,6 +125,18 @@ class TemplateTests(SimpleTestCase):
t.render(Context())
self.assertEqual(e.exception.template_debug['during'], '{% badtag %}')
+ def test_compile_tag_error_27956(self):
+ """Errors in a child of {% extends %} are displayed correctly."""
+ engine = Engine(
+ app_dirs=True,
+ debug=True,
+ libraries={'tag_27584': 'template_tests.templatetags.tag_27584'},
+ )
+ t = engine.get_template('27956_child.html')
+ with self.assertRaises(TemplateSyntaxError) as e:
+ t.render(Context())
+ self.assertEqual(e.exception.template_debug['during'], '{% badtag %}')
+
def test_super_errors(self):
"""
#18169 -- NoReverseMatch should not be silence in block.super.