Fixed #28662 -- Silenced join template filter error if arg isn't iterable.

This commit is contained in:
Mads Jensen 2017-10-11 11:09:25 +02:00 committed by Tim Graham
parent d4fb742094
commit f7036b3e26
2 changed files with 11 additions and 3 deletions

View File

@ -518,11 +518,11 @@ def first(value):
@register.filter(is_safe=True, needs_autoescape=True)
def join(value, arg, autoescape=True):
"""Join a list with a string, like Python's ``str.join(list)``."""
if autoescape:
value = [conditional_escape(v) for v in value]
try:
if autoescape:
value = [conditional_escape(v) for v in value]
data = conditional_escape(arg).join(value)
except AttributeError: # fail silently but nicely
except TypeError: # Fail silently if arg isn't iterable.
return value
return mark_safe(data)

View File

@ -65,3 +65,11 @@ class FunctionTests(SimpleTestCase):
join(['<a>', '<img>', '</a>'], '<br>', autoescape=False),
'<a>&lt;br&gt;<img>&lt;br&gt;</a>',
)
def test_noniterable_arg(self):
obj = object()
self.assertEqual(join(obj, '<br>'), obj)
def test_noniterable_arg_autoescape_off(self):
obj = object()
self.assertEqual(join(obj, '<br>', autoescape=False), obj)