Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #7318 -- Cleaned up the template inheritance logic, specificall…

…y to handle the case where the parent template has no template tags/blocks. Took the opportunity to optimize the logic a little. Thanks to Matthias Kestenholz <mk@spinlock.ch> for the original report and test case.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@7688 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 4317ba5799e2deae6059bebcb3d86e24d62e8e02 1 parent dc7f21d
Russell Keith-Magee freakboy3742 authored
16 django/template/loader_tags.py
View
@@ -69,10 +69,6 @@ def get_parent(self, context):
def render(self, context):
compiled_parent = self.get_parent(context)
- pos = 0
- while isinstance(compiled_parent.nodelist[pos], TextNode):
- pos += 1
- parent_is_child = isinstance(compiled_parent.nodelist[pos], ExtendsNode)
parent_blocks = dict([(n.name, n) for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)])
for block_node in self.nodelist.get_nodes_by_type(BlockNode):
# Check for a BlockNode with this node's name, and replace it if found.
@@ -83,8 +79,16 @@ def render(self, context):
# parent block might be defined in the parent's *parent*, so we
# add this BlockNode to the parent's ExtendsNode nodelist, so
# it'll be checked when the parent node's render() is called.
- if parent_is_child:
- compiled_parent.nodelist[pos].nodelist.append(block_node)
+
+ # Find out if the parent template has a parent itself
+ for node in compiled_parent.nodelist:
+ if not isinstance(node, TextNode):
+ # If the first non-text node is an extends, handle it.
+ if isinstance(node, ExtendsNode):
+ node.nodelist.append(block_node)
+ # Extends must be the first non-text node, so once you find
+ # the first non-text node you can stop looking.
+ break
else:
# Keep any existing parents and add a new one. Used by BlockNode.
parent_block.parent = block_node.parent
6 tests/regressiontests/templates/tests.py
View
@@ -704,6 +704,12 @@ def get_template_tests(self):
# Inheritance from local context with variable parent template
'inheritance25': ("{% extends context_template.1 %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {'context_template': [template.Template("Wrong"), template.Template("1{% block first %}_{% endblock %}3{% block second %}_{% endblock %}")]}, '1234'),
+ # Set up a base template to extend
+ 'inheritance26': ("no tags", {}, 'no tags'),
+
+ # Inheritance from a template that doesn't have any blocks
+ 'inheritance27': ("{% extends 'inheritance26' %}", {}, 'no tags'),
+
### I18N ##################################################################
# {% spaceless %} tag
Please sign in to comment.
Something went wrong with that request. Please try again.