context['item'] = item
context['children'] = self.__class__(self.template_nodes, item.get_children(), context, request)
- # Django 1.2.X compatibility - a lazy recurser will not be called if accessed as a template variable.
- if django_version < (1,3):
- context['children'] = context['children']()
-
# Then render the nodelist bit by bit.
for node in self.template_nodes:
bits.append(node.render(context))
class RecurseNavigationNode(template.Node):
- def __init__(self, template_nodes, instance_var, key):
+ def __init__(self, template_nodes, instance_var, key_var):
self.template_nodes = template_nodes
self.instance_var = instance_var
- self.key = key
+ self.key_var = key_var
def render(self, context):
try:
return ''
instance = self.instance_var.resolve(context)
+ key = self.key_var.resolve(context)
+
+ # Fall back on old behavior if the key doesn't seem to be a variable.
+ if not key:
+ token = self.key_var.token
+ if token[0] not in ["'", '"'] and '.' not in token:
+ key = token
+ else:
+ return settings.TEMPLATE_STRING_IF_INVALID
try:
- items = instance.navigation[self.key]
+ items = instance.navigation[key]
except:
return settings.TEMPLATE_STRING_IF_INVALID
raise template.TemplateSyntaxError(_('%s tag requires two arguments: a node and a navigation section name') % bits[0])
instance_var = parser.compile_filter(bits[1])
- key = bits[2]
-
- template_nodes = parser.parse(('recurse', 'endrecursenavigation',))
-
- token = parser.next_token()
- if token.contents == 'recurse':
- template_nodes.append(RecurseNavigationMarker())
- template_nodes.extend(parser.parse(('endrecursenavigation')))
- parser.delete_first_token()
+ key_var = parser.compile_filter(bits[2])
- return RecurseNavigationNode(template_nodes, instance_var, key)
+ template_nodes = parser.parse(('endrecursenavigation',))
+ token = parser.delete_first_token()
+ return RecurseNavigationNode(template_nodes, instance_var, key_var)
@register.filter