Support deferring validation on StreamField

pull/12964/head
Matt Westcott 2025-03-10 20:55:50 +00:00 zatwierdzone przez Matt Westcott
rodzic 5015eddef3
commit 397edf2ec5
3 zmienionych plików z 68 dodań i 1 usunięć

Wyświetl plik

@ -69,7 +69,8 @@ class FieldPanel(Panel):
else:
required_on_save = getattr(db_field, "required_on_save", False) or (
db_field.null is False
and db_field.get_internal_type() not in ("CharField", "TextField")
and db_field.get_internal_type()
not in ("CharField", "TextField", "JSONField")
)
if not required_on_save:

Wyświetl plik

@ -32,6 +32,7 @@ from wagtail.test.testapp.models import (
StandardIndex,
)
from wagtail.test.utils import WagtailTestUtils
from wagtail.test.utils.form_data import nested_form_data, streamfield
from wagtail.test.utils.timestamps import submittable_timestamp
@ -755,6 +756,68 @@ class TestPageCreation(WagtailTestUtils, TestCase):
).exists()
)
def test_create_streampage_post_with_blank_body(self):
post_data = nested_form_data(
{
"title": "Stream page",
"slug": "stream-page",
"body": streamfield([]),
}
)
response = self.client.post(
reverse(
"wagtailadmin_pages:add",
args=("tests", "streampage", self.root_page.id),
),
post_data,
)
# Find the page and check it
page = Page.objects.get(
path__startswith=self.root_page.path, slug="stream-page"
).specific
# Should be redirected to edit page
self.assertRedirects(
response, reverse("wagtailadmin_pages:edit", args=(page.id,))
)
self.assertEqual(len(page.body), 0)
self.assertFalse(page.live)
def test_cannot_publish_streampage_with_blank_body(self):
post_data = nested_form_data(
{
"title": "Stream page",
"slug": "stream-page",
"body": streamfield([]),
"action-publish": "Publish",
}
)
response = self.client.post(
reverse(
"wagtailadmin_pages:add",
args=("tests", "streampage", self.root_page.id),
),
post_data,
)
self.assertEqual(response.status_code, 200)
# Check that a form error was raised. The actual message as rendered
# ("This field is required.") is passed to the StreamBlock as part of
# StreamBlockValidationError.non_block_errors, whereas assertFormError
# only considers the message attribute (which is a generic error).
self.assertFormError(
response.context["form"], "body", "Validation error in StreamBlock"
)
self.assertContains(response, "This field is required.")
# Page should not have been created
self.assertFalse(
Page.objects.filter(
path__startswith=self.root_page.path, slug="stream-page"
).exists()
)
def test_create_simplepage_scheduled(self):
go_live_at = timezone.now() + datetime.timedelta(days=1)
expire_at = timezone.now() + datetime.timedelta(days=2)

Wyświetl plik

@ -756,6 +756,9 @@ class BlockField(forms.Field):
super().__init__(**kwargs)
def clean(self, value):
# Pass required flag to the top-level block, so that dynamically setting it on the
# field (e.g. by defer_required_fields) is respected by the block.
self.block.set_meta_options({"required": self.required})
return self.block.clean(value)
def has_changed(self, initial_value, data_value):