diff options
| author | Russell Keith-Magee <russell@keith-magee.com> | 2008-06-18 12:59:39 +0000 |
|---|---|---|
| committer | Russell Keith-Magee <russell@keith-magee.com> | 2008-06-18 12:59:39 +0000 |
| commit | 4317ba5799e2deae6059bebcb3d86e24d62e8e02 (patch) | |
| tree | 8e1a2443f13d4c3a8826cfc6cf3ffdb19b945c05 | |
| parent | dc7f21daf73d2aae66c3bb8a043a59cbace6e602 (diff) | |
Fixed #7318 -- Cleaned up the template inheritance logic, specifically 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
| -rw-r--r-- | django/template/loader_tags.py | 16 | ||||
| -rw-r--r-- | tests/regressiontests/templates/tests.py | 6 |
2 files changed, 16 insertions, 6 deletions
diff --git a/django/template/loader_tags.py b/django/template/loader_tags.py index 00ae99bbf9..38b2fff9fd 100644 --- a/django/template/loader_tags.py +++ b/django/template/loader_tags.py @@ -69,10 +69,6 @@ class ExtendsNode(Node): 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 @@ class ExtendsNode(Node): # 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 diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 4effea55de..089a6d312d 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -704,6 +704,12 @@ class Templates(unittest.TestCase): # 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 |
