Fixed #33653 -- Fixed template crash when calling methods for built-in types without required arguments.

Regression in 09341856ed.
This commit is contained in:
cheng 2022-05-19 21:01:10 -07:00 committed by Mariusz Felisiak
parent 1a78ef2b85
commit 0dd2920909
2 changed files with 18 additions and 7 deletions

View File

@ -913,15 +913,18 @@ class Variable:
try: # method call (assuming no args required) try: # method call (assuming no args required)
current = current() current = current()
except TypeError: except TypeError:
signature = inspect.signature(current)
try: try:
signature.bind() signature = inspect.signature(current)
except TypeError: # arguments *were* required except ValueError: # No signature found.
current = ( current = context.template.engine.string_if_invalid
context.template.engine.string_if_invalid
) # invalid method call
else: else:
raise try:
signature.bind()
except TypeError: # Arguments *were* required.
# Invalid method call.
current = context.template.engine.string_if_invalid
else:
raise
except Exception as e: except Exception as e:
template_name = getattr(context, "template_name", None) or "unknown" template_name = getattr(context, "template_name", None) or "unknown"
logger.debug( logger.debug(

View File

@ -183,6 +183,14 @@ class TemplateTestMixin:
for node in template.nodelist: for node in template.nodelist:
self.assertEqual(node.origin, template.origin) self.assertEqual(node.origin, template.origin)
def test_render_built_in_type_method(self):
"""
Templates should not crash when rendering methods for built-in types
without required arguments.
"""
template = self._engine().from_string("{{ description.count }}")
self.assertEqual(template.render(Context({"description": "test"})), "")
class TemplateTests(TemplateTestMixin, SimpleTestCase): class TemplateTests(TemplateTestMixin, SimpleTestCase):
debug_engine = False debug_engine = False