mirror of https://github.com/django/django.git
[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:
parent
b6a6787fd8
commit
8cc2f5aed1
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
{% extends "27956_parent.html" %}
|
||||||
|
|
||||||
|
{% block content %}{% endblock %}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{% load tag_27584 %}
|
||||||
|
|
||||||
|
{% badtag %}{% endbadtag %}
|
||||||
|
|
||||||
|
{% block content %}{% endblock %}
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue