浏览代码

Fixed #28071 -- Fixed {% extends %} origin history.

John D'Ambrosio 8 年之前
父节点
当前提交
be68c0bf63
共有 3 个文件被更改,包括 23 次插入1 次删除
  1. 1 0
      AUTHORS
  2. 1 1
      django/template/loader_tags.py
  3. 21 0
      tests/template_tests/test_extends.py

+ 1 - 0
AUTHORS

@@ -390,6 +390,7 @@ answer newbie questions, and generally made Django that much better:
     Johann Queuniet <johann.queuniet@adh.naellia.eu>
     john@calixto.net
     John D'Agostino <john.dagostino@gmail.com>
+    John D'Ambrosio <dambrosioj@gmail.com>
     John Huddleston <huddlej@wwu.edu>
     John Moses <moses.john.r@gmail.com>
     John Paulett <john@paulett.org>

+ 1 - 1
django/template/loader_tags.py

@@ -103,7 +103,7 @@ class ExtendsNode(Node):
         without extending the same template twice.
         """
         history = context.render_context.setdefault(
-            self.context_key, [context.template.origin],
+            self.context_key, [self.origin],
         )
         template, origin = context.template.engine.find_template(
             template_name, skip=history,

+ 21 - 0
tests/template_tests/test_extends.py

@@ -117,3 +117,24 @@ class ExtendsBehaviorTests(SimpleTestCase):
         template = engine.get_template('base.html')
         output = template.render(Context({}))
         self.assertEqual(output.strip(), 'loader2 loader1')
+
+    def test_block_override_in_extended_included_template(self):
+        """
+        ExtendsNode.find_template() initializes history with self.origin
+        (#28071).
+        """
+        engine = Engine(
+            loaders=[
+                ['django.template.loaders.locmem.Loader', {
+                    'base.html': "{% extends 'base.html' %}{% block base %}{{ block.super }}2{% endblock %}",
+                    'included.html':
+                        "{% extends 'included.html' %}{% block included %}{{ block.super }}B{% endblock %}",
+                }],
+                ['django.template.loaders.locmem.Loader', {
+                    'base.html': "{% block base %}1{% endblock %}{% include 'included.html' %}",
+                    'included.html': "{% block included %}A{% endblock %}",
+                }],
+            ],
+        )
+        template = engine.get_template('base.html')
+        self.assertEqual(template.render(Context({})), '12AB')