From 0dd29209091280ccf34e07c9468746c396b7778e Mon Sep 17 00:00:00 2001 From: cheng Date: Thu, 19 May 2022 21:01:10 -0700 Subject: [PATCH] Fixed #33653 -- Fixed template crash when calling methods for built-in types without required arguments. Regression in 09341856ed9008875c1cc883dc0c287670131458. --- django/template/base.py | 17 ++++++++++------- tests/template_tests/tests.py | 8 ++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/django/template/base.py b/django/template/base.py index a1ab437eca5..afbdc7391d5 100644 --- a/django/template/base.py +++ b/django/template/base.py @@ -913,15 +913,18 @@ class Variable: try: # method call (assuming no args required) current = current() except TypeError: - signature = inspect.signature(current) try: - signature.bind() - except TypeError: # arguments *were* required - current = ( - context.template.engine.string_if_invalid - ) # invalid method call + signature = inspect.signature(current) + except ValueError: # No signature found. + current = context.template.engine.string_if_invalid 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: template_name = getattr(context, "template_name", None) or "unknown" logger.debug( diff --git a/tests/template_tests/tests.py b/tests/template_tests/tests.py index b849b4a2e75..f35ae49ca36 100644 --- a/tests/template_tests/tests.py +++ b/tests/template_tests/tests.py @@ -183,6 +183,14 @@ class TemplateTestMixin: for node in template.nodelist: 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): debug_engine = False