summaryrefslogtreecommitdiff
path: root/django/template/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/template/__init__.py')
-rw-r--r--django/template/__init__.py85
1 files changed, 28 insertions, 57 deletions
diff --git a/django/template/__init__.py b/django/template/__init__.py
index 7495eea878..4cda9bc8d0 100644
--- a/django/template/__init__.py
+++ b/django/template/__init__.py
@@ -55,7 +55,6 @@ times with multiple contexts)
'\n<html>\n\n</html>\n'
"""
import re
-import types
from inspect import getargspec
from django.conf import settings
from django.template.context import Context, RequestContext, ContextPopException
@@ -168,12 +167,9 @@ class Template(object):
for subnode in node:
yield subnode
- def iter_render(self, context):
- "Display stage -- can be called many times"
- return self.nodelist.iter_render(context)
-
def render(self, context):
- return ''.join(self.iter_render(context))
+ "Display stage -- can be called many times"
+ return self.nodelist.render(context)
def compile_string(template_string, origin):
"Compiles template_string into NodeList ready for rendering"
@@ -699,26 +695,10 @@ def resolve_variable(path, context):
del bits[0]
return current
-class NodeBase(type):
- def __new__(cls, name, bases, attrs):
- """
- Ensures that either a 'render' or 'render_iter' method is defined on
- any Node sub-class. This avoids potential infinite loops at runtime.
- """
- if not (isinstance(attrs.get('render'), types.FunctionType) or
- isinstance(attrs.get('iter_render'), types.FunctionType)):
- raise TypeError('Unable to create Node subclass without either "render" or "iter_render" method.')
- return type.__new__(cls, name, bases, attrs)
-
class Node(object):
- __metaclass__ = NodeBase
-
- def iter_render(self, context):
- return (self.render(context),)
-
def render(self, context):
"Return the node rendered as a string"
- return ''.join(self.iter_render(context))
+ pass
def __iter__(self):
yield self
@@ -734,12 +714,13 @@ class Node(object):
class NodeList(list):
def render(self, context):
- return ''.join(self.iter_render(context))
-
- def iter_render(self, context):
+ bits = []
for node in self:
- for chunk in node.iter_render(context):
- yield chunk
+ if isinstance(node, Node):
+ bits.append(self.render_node(node, context))
+ else:
+ bits.append(node)
+ return ''.join(bits)
def get_nodes_by_type(self, nodetype):
"Return a list of all nodes of the given type"
@@ -748,25 +729,24 @@ class NodeList(list):
nodes.extend(node.get_nodes_by_type(nodetype))
return nodes
+ def render_node(self, node, context):
+ return(node.render(context))
+
class DebugNodeList(NodeList):
- def iter_render(self, context):
- for node in self:
- if not isinstance(node, Node):
- yield node
- continue
- try:
- for chunk in node.iter_render(context):
- yield chunk
- except TemplateSyntaxError, e:
- if not hasattr(e, 'source'):
- e.source = node.source
- raise
- except Exception, e:
- from sys import exc_info
- wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e)
- wrapped.source = node.source
- wrapped.exc_info = exc_info()
- raise wrapped
+ def render_node(self, node, context):
+ try:
+ result = node.render(context)
+ except TemplateSyntaxError, e:
+ if not hasattr(e, 'source'):
+ e.source = node.source
+ raise
+ except Exception, e:
+ from sys import exc_info
+ wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e)
+ wrapped.source = node.source
+ wrapped.exc_info = exc_info()
+ raise wrapped
+ return result
class TextNode(Node):
def __init__(self, s):
@@ -775,9 +755,6 @@ class TextNode(Node):
def __repr__(self):
return "<Text Node: '%s'>" % self.s[:25]
- def iter_render(self, context):
- return (self.s,)
-
def render(self, context):
return self.s
@@ -801,9 +778,6 @@ class VariableNode(Node):
else:
return output
- def iter_render(self, context):
- return (self.render(context),)
-
def render(self, context):
output = self.filter_expression.resolve(context)
return self.encode_output(output)
@@ -892,9 +866,6 @@ class Library(object):
def __init__(self, vars_to_resolve):
self.vars_to_resolve = vars_to_resolve
- #def iter_render(self, context):
- # return (self.render(context),)
-
def render(self, context):
resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve]
return func(*resolved_vars)
@@ -917,7 +888,7 @@ class Library(object):
def __init__(self, vars_to_resolve):
self.vars_to_resolve = vars_to_resolve
- def iter_render(self, context):
+ def render(self, context):
resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve]
if takes_context:
args = [context] + resolved_vars
@@ -933,7 +904,7 @@ class Library(object):
else:
t = get_template(file_name)
self.nodelist = t.nodelist
- return self.nodelist.iter_render(context_class(dict))
+ return self.nodelist.render(context_class(dict))
compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode)
compile_func.__doc__ = func.__doc__