diff --git a/wagtail/contrib/search_promotions/tests.py b/wagtail/contrib/search_promotions/tests.py
index 9fbd42cc63..d5a2650383 100644
--- a/wagtail/contrib/search_promotions/tests.py
+++ b/wagtail/contrib/search_promotions/tests.py
@@ -599,26 +599,25 @@ class TestSearchPromotionsAddView(WagtailTestUtils, TestCase):
         # User should be given an error on the specific field in the form
         self.assertEqual(response.status_code, 200)
 
-        # This currently fails because of a bug in the formset handling
-        # self.assertFormError(
-        #     response.context["form"], "query_string", "This field is required."
-        # )
-        # # The formset should still contain the submitted data
-        # self.assertEqual(len(response.context["searchpicks_formset"].forms), 1)
-        # self.assertEqual(
-        #     response.context["searchpicks_formset"].forms[0].cleaned_data["page"].id,
-        #     1,
-        # )
-        # self.assertEqual(
-        #     response.context["searchpicks_formset"]
-        #     .forms[0]
-        #     .cleaned_data["description"],
-        #     "Hello",
-        # )
-        # # Should not raise an error anywhere else
-        # self.assertFormSetError(response.context["searchpicks_formset"], 0, "page", [])
-        # self.assertFormSetError(response.context["searchpicks_formset"], 0, None, [])
-        # self.assertFormSetError(response.context["searchpicks_formset"], None, None, [])
+        self.assertFormError(
+            response.context["form"], "query_string", "This field is required."
+        )
+        # The formset should still contain the submitted data
+        self.assertEqual(len(response.context["searchpicks_formset"].forms), 1)
+        self.assertEqual(
+            response.context["searchpicks_formset"].forms[0].cleaned_data["page"].id,
+            1,
+        )
+        self.assertEqual(
+            response.context["searchpicks_formset"]
+            .forms[0]
+            .cleaned_data["description"],
+            "Hello",
+        )
+        # Should not raise an error anywhere else
+        self.assertFormSetError(response.context["searchpicks_formset"], 0, "page", [])
+        self.assertFormSetError(response.context["searchpicks_formset"], 0, None, [])
+        self.assertFormSetError(response.context["searchpicks_formset"], None, None, [])
 
     def test_post_with_invalid_page(self):
         # Submit
diff --git a/wagtail/contrib/search_promotions/views/settings.py b/wagtail/contrib/search_promotions/views/settings.py
index 7d3d5940ac..654302b1dd 100644
--- a/wagtail/contrib/search_promotions/views/settings.py
+++ b/wagtail/contrib/search_promotions/views/settings.py
@@ -5,6 +5,7 @@ from django.http import Http404
 from django.shortcuts import get_object_or_404, redirect
 from django.template.response import TemplateResponse
 from django.urls import reverse
+from django.utils.functional import cached_property
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext_lazy
 
@@ -146,10 +147,6 @@ class CreateView(generic.CreateView):
     def form_valid(self, form):
         self.form = form
         self.object = Query.get(form.cleaned_data["query_string"])
-        # Save search picks
-        self.searchpicks_formset = forms.SearchPromotionsFormSet(
-            self.request.POST, instance=self.object
-        )
 
         if save_searchpicks(self.object, self.object, self.searchpicks_formset):
             messages.success(
@@ -161,13 +158,13 @@ class CreateView(generic.CreateView):
 
         return super().form_invalid(form)
 
-    def form_invalid(self, form):
-        self.searchpicks_formset = forms.SearchPromotionsFormSet()
-        return super().form_invalid(form)
-
-    def get(self, request, *args, **kwargs):
-        self.searchpicks_formset = forms.SearchPromotionsFormSet()
-        return super().get(request, *args, **kwargs)
+    @cached_property
+    def searchpicks_formset(self):
+        if self.request.method == "POST":
+            return forms.SearchPromotionsFormSet(
+                self.request.POST, instance=self.object
+            )
+        return forms.SearchPromotionsFormSet()
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)