from django.template import Library, Node, TemplateSyntaxError
register = Library()
def parse_args_kwargs_and_as_var(parser, bits):
args = []
kwargs = {}
as_var = None
bits = iter(bits)
for bit in bits:
if bit == 'as':
as_var = bits.next()
break
else:
for arg in bit.split(","):
if '=' in arg:
k, v = arg.split('=', 1)
k = k.strip()
kwargs[k] = parser.compile_filter(v)
elif arg:
args.append(parser.compile_filter(arg))
return args, kwargs, as_var
def get_args_and_kwargs(args, kwargs, context):
out_args = [arg.resolve(context) for arg in args]
out_kwargs = dict([(smart_str(k,'ascii'), v.resolve(context)) for k, v in kwargs.items()])
return out_args, out_kwargs
class SomeObject(object):
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
class GetWithArgsAndKwargs(Node):
def __init__(self, args, kwargs, as_var):
self.args = args
self.kwargs = kwargs
self.as_var = as_var
def render(self, context):
args, kwargs = get_args_and_kwargs(self.args, self.kwargs, context)
# call something with the args or kwargs here
some_object = SomeObject(*args, **kwargs)
context[self.as_var] = some_object
return ''
def get_with_args_and_kwargs(parser, token):
bits = token.contents.split(' ')
if len(bits) < 1:
raise TemplateSyntaxError("'%s' takes at least one argument" % bits[0])
if len(bits) > 1:
args, kwargs, as_var = parse_args_kwargs_and_as_var(parser, bits[1:])
return GetWithArgsAndKwargs(args, kwargs, as_var)
register.tag(get_with_args_and_kwargs)
Comments