Enforce validation on save for FieldPanels corresponding to non-null, non-text-type model fields

pull/12964/head
Matt Westcott 2025-02-28 00:39:22 +00:00 zatwierdzone przez Matt Westcott
rodzic 96f9ebe3f6
commit 2b882743ec
4 zmienionych plików z 80 dodań i 1 usunięć

Wyświetl plik

@ -67,7 +67,10 @@ class FieldPanel(Panel):
except FieldDoesNotExist:
required_on_save = False
else:
required_on_save = getattr(db_field, "required_on_save", False)
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")
)
if not required_on_save:
opts["defer_required_on_fields"] = [self.field_name]

Wyświetl plik

@ -672,6 +672,37 @@ class TestPageCreation(WagtailTestUtils, TestCase):
).exists()
)
def test_cannot_create_page_with_blank_required_date(self):
"""
A non-nullable, non-text field cannot be saved with a blank value, so we should
enforce requiredness even when saving as draft
"""
post_data = {
"title": "Page with missing date",
"deadline": "",
"slug": "missing-date",
}
response = self.client.post(
reverse(
"wagtailadmin_pages:add",
args=("tests", "requireddatepage", self.root_page.id),
),
post_data,
)
self.assertEqual(response.status_code, 200)
# Check that a form error was raised
self.assertFormError(
response.context["form"], "deadline", "This field is required."
)
# Page should not have been created
self.assertFalse(
Page.objects.filter(
path__startswith=self.root_page.path, slug="missing-date"
).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

@ -0,0 +1,36 @@
# Generated by Django 5.1.5 on 2025-02-28 00:28
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("tests", "0047_advertwithcustomuuidprimarykey_page"),
("wagtailcore", "0094_alter_page_locale"),
]
operations = [
migrations.CreateModel(
name="RequiredDatePage",
fields=[
(
"page_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.page",
),
),
("deadline", models.DateField()),
],
options={
"abstract": False,
},
bases=("wagtailcore.page",),
),
]

Wyświetl plik

@ -2487,3 +2487,12 @@ class CustomPermissionModel(models.Model):
register_snippet(CustomPermissionModel)
class RequiredDatePage(Page):
deadline = models.DateField()
content_panels = [
TitleFieldPanel("title", classname="title"),
FieldPanel("deadline"),
]