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)