#coding=utf-8 from django import template register = template.Library() #register.tag('source', do_source) @register.tag(name="source") def do_source(parser, token): """ source can direct insert method return string into html {% source myapp mymethod %} or {% source myapp mymethod arg0 arg1 arg2 %} or {% source myapp mymethod arg0,arg1,arg2 %} """ try: # split_contents() knows not to split quoted strings. args = token.split_contents() except ValueError: raise template.TemplateSyntaxError("%r tag requires at least two arguments" % token.contents.split()[0]) if len(args) < 2: raise template.TemplateSyntaxError("%r tag requires at least two arguments" % token.contents.split()[0]) model_name = args[1] method_name = args[2] params = [] if len(args) >=3: params += args[3:] if len(params) == 1: if ',' in params[0]: params = ['%s' % arg for arg in params[0].split(",")] # try to import this method try: models = __import__(model_name, fromlist = [method_name]) method = getattr(models, method_name) except: raise template.TemplateSyntaxError("Can't import %s[%s]" % (model_name, method_name)) return SourceNode(method, params) class SourceNode(template.Node): def __init__(self, method, params): self.method = method self.params = params def render(self, context): try: value = self.method(context, (arg for arg in self.params)) except: from django.conf import settings if settings.DEBUG: import sys,traceback str = '<p> [%s] [%s] </p>' % (self.method, self.params) str += '<p> [%s] </p>' % traceback.format_exception(*sys.exc_info()) return str else: return str return value