Kaydet (Commit) 9ef491b0 authored tarafından Adrian Holovaty's avatar Adrian Holovaty

Optimized {% cycle %} template tag so that it creates the Variable objects in…

Optimized {% cycle %} template tag so that it creates the Variable objects in CycleNode.__init__() rather than each time render() is called

git-svn-id: http://code.djangoproject.com/svn/django/trunk@7756 bcc190cf-cafb-0310-a4f2-bffc1f526a37
üst b7fea940
...@@ -39,12 +39,11 @@ class CommentNode(Node): ...@@ -39,12 +39,11 @@ class CommentNode(Node):
class CycleNode(Node): class CycleNode(Node):
def __init__(self, cyclevars, variable_name=None): def __init__(self, cyclevars, variable_name=None):
self.cycle_iter = itertools_cycle(cyclevars) self.cycle_iter = itertools_cycle([Variable(v) for v in cyclevars])
self.variable_name = variable_name self.variable_name = variable_name
def render(self, context): def render(self, context):
value = self.cycle_iter.next() value = self.cycle_iter.next().resolve(context)
value = Variable(value).resolve(context)
if self.variable_name: if self.variable_name:
context[self.variable_name] = value context[self.variable_name] = value
return value return value
...@@ -454,17 +453,17 @@ def cycle(parser, token): ...@@ -454,17 +453,17 @@ def cycle(parser, token):
<tr class="{% cycle rowcolors %}">...</tr> <tr class="{% cycle rowcolors %}">...</tr>
<tr class="{% cycle rowcolors %}">...</tr> <tr class="{% cycle rowcolors %}">...</tr>
You can use any number of values, seperated by spaces. Commas can also You can use any number of values, separated by spaces. Commas can also
be used to separate values; if a comma is used, the cycle values are be used to separate values; if a comma is used, the cycle values are
interpreted as literal strings. interpreted as literal strings.
""" """
# Note: This returns the exact same node on each {% cycle name %} call; # Note: This returns the exact same node on each {% cycle name %} call;
# that is, the node object returned from {% cycle a b c as name %} and the # that is, the node object returned from {% cycle a b c as name %} and the
# one returned from {% cycle name %} are the exact same object. This # one returned from {% cycle name %} are the exact same object. This
# shouldn't cause problems (heh), but if it does, now you know. # shouldn't cause problems (heh), but if it does, now you know.
# #
# Ugly hack warning: this stuffs the named template dict into parser so # Ugly hack warning: This stuffs the named template dict into parser so
# that names are only unique within each template (as opposed to using # that names are only unique within each template (as opposed to using
# a global variable, which would make cycle names have to be unique across # a global variable, which would make cycle names have to be unique across
# *all* templates. # *all* templates.
...@@ -483,8 +482,7 @@ def cycle(parser, token): ...@@ -483,8 +482,7 @@ def cycle(parser, token):
# {% cycle foo %} case. # {% cycle foo %} case.
name = args[1] name = args[1]
if not hasattr(parser, '_namedCycleNodes'): if not hasattr(parser, '_namedCycleNodes'):
raise TemplateSyntaxError("No named cycles in template." raise TemplateSyntaxError("No named cycles in template. '%s' is not defined" % name)
" '%s' is not defined" % name)
if not name in parser._namedCycleNodes: if not name in parser._namedCycleNodes:
raise TemplateSyntaxError("Named cycle '%s' does not exist" % name) raise TemplateSyntaxError("Named cycle '%s' does not exist" % name)
return parser._namedCycleNodes[name] return parser._namedCycleNodes[name]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment