summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorPreston Timmons <prestontimmons@gmail.com>2015-01-16 17:34:32 -0600
committerTim Graham <timograham@gmail.com>2015-02-03 10:44:33 -0500
commitcd4282816db9164791cd0ac97a3dc329ad92c522 (patch)
tree6ace721036a457465a0b7b3abfcd691d34801eb2 /django
parent8adc59038cdc6ce4f9170e4de2d716d940e136b3 (diff)
Fixed #18651 -- Enabled optional assignments for simple_tag().
Diffstat (limited to 'django')
-rw-r--r--django/template/base.py79
1 files changed, 30 insertions, 49 deletions
diff --git a/django/template/base.py b/django/template/base.py
index 6594af1e1a..775b5d8238 100644
--- a/django/template/base.py
+++ b/django/template/base.py
@@ -61,7 +61,8 @@ from django.apps import apps
from django.template.context import (BaseContext, Context, RequestContext, # NOQA: imported for backwards compatibility
ContextPopException)
from django.utils import lru_cache
-from django.utils.deprecation import RemovedInDjango20Warning
+from django.utils.deprecation import (RemovedInDjango20Warning,
+ RemovedInDjango21Warning)
from django.utils.itercompat import is_iterable
from django.utils.text import (smart_split, unescape_string_literal,
get_text_list)
@@ -1021,9 +1022,9 @@ def token_kwargs(bits, parser, support_legacy=False):
def parse_bits(parser, bits, params, varargs, varkw, defaults,
takes_context, name):
"""
- Parses bits for template tag helpers (simple_tag, include_tag and
- assignment_tag), in particular by detecting syntax errors and by
- extracting positional and keyword arguments.
+ Parses bits for template tag helpers simple_tag and inclusion_tag, in
+ particular by detecting syntax errors and by extracting positional and
+ keyword arguments.
"""
if takes_context:
if params[0] == 'context':
@@ -1099,9 +1100,9 @@ def generic_tag_compiler(parser, token, params, varargs, varkw, defaults,
class TagHelperNode(Node):
"""
- Base class for tag helper nodes such as SimpleNode, InclusionNode and
- AssignmentNode. Manages the positional and keyword arguments to be passed
- to the decorated function.
+ Base class for tag helper nodes such as SimpleNode and InclusionNode.
+ Manages the positional and keyword arguments to be passed to the decorated
+ function.
"""
def __init__(self, takes_context, args, kwargs):
@@ -1191,71 +1192,51 @@ class Library(object):
params, varargs, varkw, defaults = getargspec(func)
class SimpleNode(TagHelperNode):
-
- def render(self, context):
- resolved_args, resolved_kwargs = self.get_resolved_arguments(context)
- return func(*resolved_args, **resolved_kwargs)
-
- function_name = (name or
- getattr(func, '_decorated_function', func).__name__)
- compile_func = partial(generic_tag_compiler,
- params=params, varargs=varargs, varkw=varkw,
- defaults=defaults, name=function_name,
- takes_context=takes_context, node_class=SimpleNode)
- compile_func.__doc__ = func.__doc__
- self.tag(function_name, compile_func)
- return func
-
- if func is None:
- # @register.simple_tag(...)
- return dec
- elif callable(func):
- # @register.simple_tag
- return dec(func)
- else:
- raise TemplateSyntaxError("Invalid arguments provided to simple_tag")
-
- def assignment_tag(self, func=None, takes_context=None, name=None):
- def dec(func):
- params, varargs, varkw, defaults = getargspec(func)
-
- class AssignmentNode(TagHelperNode):
def __init__(self, takes_context, args, kwargs, target_var):
- super(AssignmentNode, self).__init__(takes_context, args, kwargs)
+ super(SimpleNode, self).__init__(takes_context, args, kwargs)
self.target_var = target_var
def render(self, context):
resolved_args, resolved_kwargs = self.get_resolved_arguments(context)
- context[self.target_var] = func(*resolved_args, **resolved_kwargs)
- return ''
+ output = func(*resolved_args, **resolved_kwargs)
+ if self.target_var is not None:
+ context[self.target_var] = output
+ return ''
+ return output
function_name = (name or
getattr(func, '_decorated_function', func).__name__)
def compile_func(parser, token):
bits = token.split_contents()[1:]
- 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'" % function_name)
- target_var = bits[-1]
- bits = bits[:-2]
+ target_var = None
+ if len(bits) >= 2 and bits[-2] == 'as':
+ target_var = bits[-1]
+ bits = bits[:-2]
args, kwargs = parse_bits(parser, bits, params,
varargs, varkw, defaults, takes_context, function_name)
- return AssignmentNode(takes_context, args, kwargs, target_var)
+ return SimpleNode(takes_context, args, kwargs, target_var)
compile_func.__doc__ = func.__doc__
self.tag(function_name, compile_func)
return func
if func is None:
- # @register.assignment_tag(...)
+ # @register.simple_tag(...)
return dec
elif callable(func):
- # @register.assignment_tag
+ # @register.simple_tag
return dec(func)
else:
- raise TemplateSyntaxError("Invalid arguments provided to assignment_tag")
+ raise TemplateSyntaxError("Invalid arguments provided to simple_tag")
+
+ def assignment_tag(self, func=None, takes_context=None, name=None):
+ warnings.warn(
+ "assignment_tag() is deprecated. Use simple_tag() instead",
+ RemovedInDjango21Warning,
+ stacklevel=2,
+ )
+ return self.simple_tag(func, takes_context, name)
def inclusion_tag(self, file_name, takes_context=False, name=None):
def dec(func):