Skip to content

Instantly share code, notes, and snippets.

@SmileyChris
Created May 4, 2012 04:33
Show Gist options
  • Save SmileyChris/2592044 to your computer and use it in GitHub Desktop.
Save SmileyChris/2592044 to your computer and use it in GitHub Desktop.
Silent invalid arguments -> None
diff --git a/django/template/base.py b/django/template/base.py
index ab44bfb..3567756 100644
--- a/django/template/base.py
+++ b/django/template/base.py
@@ -551,9 +551,9 @@ class FilterExpression(object):
args = []
constant_arg, var_arg = match.group("constant_arg", "var_arg")
if constant_arg:
- args.append((False, Variable(constant_arg).resolve({})))
+ args.append(mark_safe(Variable(constant_arg).resolve({})))
elif var_arg:
- args.append((True, Variable(var_arg)))
+ args.append(Variable(var_arg))
filter_func = parser.find_filter(filter_name)
self.args_check(filter_name, filter_func, args)
filters.append((filter_func, args))
@@ -565,32 +565,34 @@ class FilterExpression(object):
self.filters = filters
self.var = var_obj
+ def resolve_var(self, var, context, ignore_failures=False):
+ if not isinstance(var, Variable):
+ return var
+ try:
+ return var.resolve(context)
+ except VariableDoesNotExist:
+ if ignore_failures:
+ return None
+ raise
+
def resolve(self, context, ignore_failures=False):
- if isinstance(self.var, Variable):
- try:
- obj = self.var.resolve(context)
- except VariableDoesNotExist:
- if ignore_failures:
- obj = None
- else:
- if settings.TEMPLATE_STRING_IF_INVALID:
- global invalid_var_format_string
- if invalid_var_format_string is None:
- invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
- if invalid_var_format_string:
- return settings.TEMPLATE_STRING_IF_INVALID % self.var
- return settings.TEMPLATE_STRING_IF_INVALID
- else:
- obj = settings.TEMPLATE_STRING_IF_INVALID
- else:
- obj = self.var
+ try:
+ obj = self.resolve_var(self.var, context, ignore_failures)
+ except VariableDoesNotExist:
+ if settings.TEMPLATE_STRING_IF_INVALID:
+ global invalid_var_format_string
+ if invalid_var_format_string is None:
+ invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
+ if invalid_var_format_string:
+ return settings.TEMPLATE_STRING_IF_INVALID % self.var
+ return settings.TEMPLATE_STRING_IF_INVALID
+ else:
+ obj = settings.TEMPLATE_STRING_IF_INVALID
for func, args in self.filters:
arg_vals = []
- for lookup, arg in args:
- if not lookup:
- arg_vals.append(mark_safe(arg))
- else:
- arg_vals.append(arg.resolve(context))
+ for arg in args:
+ arg_vals.append(self.resolve_var(arg, context,
+ ignore_failures=True))
if getattr(func, 'expects_localtime', False):
obj = template_localtime(obj, context.use_tz)
if getattr(func, 'needs_autoescape', False):
@@ -853,6 +855,8 @@ def _render_value_in_context(value, context):
means escaping, if required, and conversion to a unicode object. If value
is a string, it is expected to have already been translated.
"""
+ if value is None:
+ return u''
value = template_localtime(value, use_tz=context.use_tz)
value = localize(value, use_l10n=context.use_l10n)
value = force_unicode(value)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment