瀏覽代碼

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

Regression in 09341856ed9008875c1cc883dc0c287670131458.
cheng 2 年之前
父節點
當前提交
0dd2920909
共有 2 個文件被更改,包括 18 次插入7 次删除
  1. 10 7
      django/template/base.py
  2. 8 0
      tests/template_tests/tests.py

+ 10 - 7
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(

+ 8 - 0
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