def some_function(db, handle): return db.some_method(handle) class TemplateNode(template.Node): def __init__(self, args, var_name, func): self.args = map(template.Variable, args) self.var_name = var_name self.func = func def render(self, context): value = self.func(*[item.resolve(context) for item in self.args]) if self.var_name: context[self.var_name] = value return '' else: return value def parse_tokens(tokens): items = tokens.contents.split(None) # {% tag_name arg1 arg2 arg3 as variable %} # {% tag_name arg1 arg2 arg3 %} tag_name = items[0] if "as" == items[-2]: var_name = items[-1] args = items[1:-2] else: var_name = None args = items[1:] return (tag_name, args, var_name) def make_tag(func): def do_func(parser, tokens): tag_name, args, var_name = parse_tokens(tokens) return TemplateNode(args, var_name, func) return do_func register.tag("some_function", make_tag(some_function))