diff options
| author | Jannis Leidel <jannis@leidel.info> | 2011-05-03 11:52:42 +0000 |
|---|---|---|
| committer | Jannis Leidel <jannis@leidel.info> | 2011-05-03 11:52:42 +0000 |
| commit | 950e05c3ff5daa360c3bddb84831d40b167062f1 (patch) | |
| tree | fc7e06e7303e603d3dc61872b147999898779032 /django | |
| parent | 8ce352c21d9ce4c59fcd259103350772954a6f8e (diff) | |
Fixed #14262 -- Added new assignment_tag as a simple way to assign the result of a template tag to a context variable. Thanks, Julien Phalip.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@16149 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
| -rw-r--r-- | django/template/base.py | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/django/template/base.py b/django/template/base.py index 087c86d5ea..eacc29cfcd 100644 --- a/django/template/base.py +++ b/django/template/base.py @@ -901,6 +901,66 @@ class Library(object): else: raise TemplateSyntaxError("Invalid arguments provided to simple_tag") + def assignment_tag(self, func=None, takes_context=None): + def dec(func): + params, xx, xxx, defaults = getargspec(func) + if takes_context: + if params[0] == 'context': + params = params[1:] + else: + raise TemplateSyntaxError("Any tag function decorated with takes_context=True must have a first argument of 'context'") + + class AssignmentNode(Node): + def __init__(self, params_vars, target_var): + self.params_vars = map(Variable, params_vars) + self.target_var = target_var + + def render(self, context): + resolved_vars = [var.resolve(context) for var in self.params_vars] + if takes_context: + func_args = [context] + resolved_vars + else: + func_args = resolved_vars + context[self.target_var] = func(*func_args) + return '' + + def compile_func(parser, token): + bits = token.split_contents() + tag_name = bits[0] + bits = bits[1:] + params_max = len(params) + defaults_length = defaults and len(defaults) or 0 + params_min = params_max - defaults_length + if (len(bits) < 2 or bits[-2] != 'as'): + raise TemplateSyntaxError( + "'%s' tag takes at least 2 arguments and the " + "second last argument must be 'as'" % tag_name) + params_vars = bits[:-2] + target_var = bits[-1] + if (len(params_vars) < params_min or + len(params_vars) > params_max): + if params_min == params_max: + raise TemplateSyntaxError( + "%s takes %s arguments" % (tag_name, params_min)) + else: + raise TemplateSyntaxError( + "%s takes between %s and %s arguments" + % (tag_name, params_min, params_max)) + return AssignmentNode(params_vars, target_var) + + compile_func.__doc__ = func.__doc__ + self.tag(getattr(func, "_decorated_function", func).__name__, compile_func) + return func + + if func is None: + # @register.assignment_tag(...) + return dec + elif callable(func): + # @register.assignment_tag + return dec(func) + else: + raise TemplateSyntaxError("Invalid arguments provided to assignment_tag") + def inclusion_tag(self, file_name, context_class=Context, takes_context=False): def dec(func): params, xx, xxx, defaults = getargspec(func) |
