mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	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
This commit is contained in:
		| @@ -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): | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user