[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 e643ba8bcf from master
This commit is contained in:
Tim Graham 2017-03-25 08:22:12 -04:00
parent b6a6787fd8
commit 8cc2f5aed1
5 changed files with 27 additions and 4 deletions

View File

@ -215,15 +215,17 @@ class RenderContext(BaseContext):
return self.dicts[-1][key] return self.dicts[-1][key]
@contextmanager @contextmanager
def push_state(self, template): def push_state(self, template, isolated_context=True):
initial = self.template initial = self.template
self.template = template self.template = template
self.push() if isolated_context:
self.push()
try: try:
yield yield
finally: finally:
self.template = initial self.template = initial
self.pop() if isolated_context:
self.pop()
class RequestContext(Context): class RequestContext(Context):

View File

@ -173,7 +173,8 @@ class ExtendsNode(Node):
# Call Template._render explicitly so the parser context stays # Call Template._render explicitly so the parser context stays
# the same. # 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): class IncludeNode(Node):

View File

@ -0,0 +1,3 @@
{% extends "27956_parent.html" %}
{% block content %}{% endblock %}

View File

@ -0,0 +1,5 @@
{% load tag_27584 %}
{% badtag %}{% endbadtag %}
{% block content %}{% endblock %}

View File

@ -125,6 +125,18 @@ class TemplateTests(SimpleTestCase):
t.render(Context()) t.render(Context())
self.assertEqual(e.exception.template_debug['during'], '{% badtag %}') 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): def test_super_errors(self):
""" """
#18169 -- NoReverseMatch should not be silence in block.super. #18169 -- NoReverseMatch should not be silence in block.super.