[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]
@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):

View File

@ -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):

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())
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.