Add mechanism for deferring required field validation on WagtailAdminModelForm

pull/12964/head
Matt Westcott 2025-02-20 19:37:11 +00:00 zatwierdzone przez Matt Westcott
rodzic 8f640a8cdb
commit 8cdbbcfe29
2 zmienionych plików z 39 dodań i 1 usunięć

Wyświetl plik

@ -103,7 +103,10 @@ def formfield_for_dbfield(db_field, **kwargs):
class WagtailAdminModelFormOptions(PermissionedFormOptionsMixin, ClusterFormOptions):
# Container for the options set in the inner 'class Meta' of a model form, supporting
# extensions for both ClusterForm ('formsets') and PermissionedForm ('field_permissions').
pass
def __init__(self, options=None):
super().__init__(options)
self.defer_required_on_fields = getattr(options, "defer_required_on_fields", [])
class WagtailAdminModelFormMetaclass(PermissionedFormMetaclass, ClusterFormMetaclass):
@ -125,6 +128,13 @@ class WagtailAdminModelForm(
self.for_user = kwargs.get("for_user")
super().__init__(*args, **kwargs)
def defer_required_fields(self):
for field_name in self._meta.defer_required_on_fields:
try:
self.fields[field_name].required = False
except KeyError:
pass
class Meta:
formfield_callback = formfield_for_dbfield

Wyświetl plik

@ -2,6 +2,8 @@ from django.forms.fields import CharField
from django.test import SimpleTestCase, TestCase
from wagtail.admin.forms.auth import LoginForm, PasswordResetForm
from wagtail.admin.forms.models import WagtailAdminModelForm
from wagtail.test.testapp.models import Advert
class CustomLoginForm(LoginForm):
@ -28,3 +30,29 @@ class TestPasswordResetForm(SimpleTestCase):
def test_extra_fields(self):
form = CustomPasswordResetForm()
self.assertEqual(list(form.extra_fields), [("captcha", form["captcha"])])
class TestDeferRequiredFields(TestCase):
def test_defer_required_fields(self):
class AdvertForm(WagtailAdminModelForm):
class Meta:
model = Advert
fields = ["url", "text"]
defer_required_on_fields = ["text"]
form = AdvertForm(
{
"url": "https://www.example.com",
"text": "",
}
)
self.assertFalse(form.is_valid())
form = AdvertForm(
{
"url": "https://www.example.com",
"text": "",
}
)
form.defer_required_fields()
self.assertTrue(form.is_valid())