summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-03-02 07:42:51 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-03-02 07:42:51 +0000
commitf034c79cbc4f1a235e53d4ec666885ab8e9af8d9 (patch)
tree9d64966c0af403b76d796965afa00b2727e924a1 /django
parentecb56cecbddffe7f06e94a08d2d71713d85514e4 (diff)
Fixed #6510 -- Refactored the way child nodes are found in template nodes to avoid potential inconsistencies. Thanks to SmileyChris for the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12654 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/template/__init__.py7
-rw-r--r--django/template/defaulttags.py24
2 files changed, 13 insertions, 18 deletions
diff --git a/django/template/__init__.py b/django/template/__init__.py
index 7fb01f05b6..33ea0aa60f 100644
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -770,6 +770,7 @@ class Node(object):
# Set this to True for nodes that must be first in the template (although
# they can be preceded by text nodes.
must_be_first = False
+ child_nodelists = ('nodelist',)
def render(self, context):
"Return the node rendered as a string"
@@ -783,8 +784,10 @@ class Node(object):
nodes = []
if isinstance(self, nodetype):
nodes.append(self)
- if hasattr(self, 'nodelist'):
- nodes.extend(self.nodelist.get_nodes_by_type(nodetype))
+ for attr in self.child_nodelists:
+ nodelist = getattr(self, attr, None)
+ if nodelist:
+ nodes.extend(nodelist.get_nodes_by_type(nodetype))
return nodes
class NodeList(list):
diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py
index 69afd84c43..4b0a4d1fa6 100644
--- a/django/template/defaulttags.py
+++ b/django/template/defaulttags.py
@@ -97,6 +97,8 @@ class FirstOfNode(Node):
return u''
class ForNode(Node):
+ child_nodelists = ('nodelist_loop', 'nodelist_empty')
+
def __init__(self, loopvars, sequence, is_reversed, nodelist_loop, nodelist_empty=None):
self.loopvars, self.sequence = loopvars, sequence
self.is_reversed = is_reversed
@@ -118,14 +120,6 @@ class ForNode(Node):
for node in self.nodelist_empty:
yield node
- def get_nodes_by_type(self, nodetype):
- nodes = []
- if isinstance(self, nodetype):
- nodes.append(self)
- nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype))
- nodes.extend(self.nodelist_empty.get_nodes_by_type(nodetype))
- return nodes
-
def render(self, context):
if 'forloop' in context:
parentloop = context['forloop']
@@ -181,6 +175,8 @@ class ForNode(Node):
return nodelist.render(context)
class IfChangedNode(Node):
+ child_nodelists = ('nodelist_true', 'nodelist_false')
+
def __init__(self, nodelist_true, nodelist_false, *varlist):
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
self._last_seen = None
@@ -211,6 +207,8 @@ class IfChangedNode(Node):
return ''
class IfEqualNode(Node):
+ child_nodelists = ('nodelist_true', 'nodelist_false')
+
def __init__(self, var1, var2, nodelist_true, nodelist_false, negate):
self.var1, self.var2 = var1, var2
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
@@ -227,6 +225,8 @@ class IfEqualNode(Node):
return self.nodelist_false.render(context)
class IfNode(Node):
+ child_nodelists = ('nodelist_true', 'nodelist_false')
+
def __init__(self, var, nodelist_true, nodelist_false=None):
self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
self.var = var
@@ -240,14 +240,6 @@ class IfNode(Node):
for node in self.nodelist_false:
yield node
- def get_nodes_by_type(self, nodetype):
- nodes = []
- if isinstance(self, nodetype):
- nodes.append(self)
- nodes.extend(self.nodelist_true.get_nodes_by_type(nodetype))
- nodes.extend(self.nodelist_false.get_nodes_by_type(nodetype))
- return nodes
-
def render(self, context):
if self.var.eval(context):
return self.nodelist_true.render(context)