From cb383753c0e0eb52306e1024d32a782549c27e61 Mon Sep 17 00:00:00 2001
From: Baptiste Mispelon <bmispelon@gmail.com>
Date: Wed, 8 Dec 2021 14:46:22 +0100
Subject: [PATCH] Fixed #33346 -- Fixed SimpleTestCase.assertFormsetError()
 crash on a formset named "form".

Thanks OutOfFocus4 for the report.

Regression in 456466d932830b096d39806e291fe23ec5ed38d5.
---
 django/test/testcases.py  |  2 +-
 docs/releases/4.0.1.txt   |  4 +++-
 tests/test_utils/tests.py | 10 ++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/django/test/testcases.py b/django/test/testcases.py
index 0e4d406464..ddd9fe3c7f 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -572,7 +572,7 @@ class SimpleTestCase(unittest.TestCase):
         # Search all contexts for the error.
         found_formset = False
         for i, context in enumerate(contexts):
-            if formset not in context:
+            if formset not in context or not hasattr(context[formset], 'forms'):
                 continue
             found_formset = True
             for err in errors:
diff --git a/docs/releases/4.0.1.txt b/docs/releases/4.0.1.txt
index d5a674778e..fa4ebe826f 100644
--- a/docs/releases/4.0.1.txt
+++ b/docs/releases/4.0.1.txt
@@ -9,4 +9,6 @@ Django 4.0.1 fixes several bugs in 4.0.
 Bugfixes
 ========
 
-* ...
+* Fixed a regression in Django 4.0 that caused a crash of
+  :meth:`~django.test.SimpleTestCase.assertFormsetError` on a formset named
+  ``form`` (:ticket:`33346`).
diff --git a/tests/test_utils/tests.py b/tests/test_utils/tests.py
index 47ce93e2ca..a2cb12c20e 100644
--- a/tests/test_utils/tests.py
+++ b/tests/test_utils/tests.py
@@ -1512,6 +1512,16 @@ class AssertFormsetErrorTests(SimpleTestCase):
         ])
         self.assertFormsetError(response, 'formset', None, None, 'error')
 
+    def test_formset_named_form(self):
+        formset = TestFormset.invalid()
+        # The mocked context emulates the template-based rendering of the
+        # formset.
+        response = mock.Mock(context=[
+            {'form': formset},
+            {'form': formset.management_form},
+        ])
+        self.assertFormsetError(response, 'form', 0, 'field', 'invalid value')
+
 
 class FirstUrls:
     urlpatterns = [path('first/', empty_response, name='first')]