diff options
| author | cheng <chengyuan.china@gmail.com> | 2022-05-19 21:01:10 -0700 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-05-20 08:41:16 +0200 |
| commit | 731bb6479e7ac5b50f00b8827955e86af27a2507 (patch) | |
| tree | c6a472a9ed33ae265e2381b70344a4474518084c | |
| parent | 33552c7a135e03baf52f817214d2452fd8d22fef (diff) | |
[4.1.x] Fixed #33653 -- Fixed template crash when calling methods for built-in types without required arguments.
Regression in 09341856ed9008875c1cc883dc0c287670131458.
Backport of 0dd29209091280ccf34e07c9468746c396b7778e from main
| -rw-r--r-- | django/template/base.py | 17 | ||||
| -rw-r--r-- | 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 a1ab437eca..afbdc7391d 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 b849b4a2e7..f35ae49ca3 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 |
