Я копался в исходном коде трясогузки и думаю, что нашел способ доступа к элементам управления формы для заказа.
Допустим, у вас есть модель для страницы,
class TestPage(Page):
testPageTitle = RichTextField(blank=True, max_length=250)
content_panels = Page.content_panels + [
FieldPanel('testPageTitle'),
InlinePanel('test_page_field')
]
base_form_class = TestPageForm
с некоторой заказываемой моделью, которая связана со страницей через связанное имя 'test_page_field',
class TestPageField(Orderable):
page = ParentalKey(TestPage, on_delete=models.CASCADE, related_name='test_page_field')
testPageFieldTitle = models.CharField(blank=True, max_length=250)
panels = [
FieldPanel('testPageFieldFieldTitle')
]
, тогда вы можете получить доступ к этому в чистом методе страницы через self.formsets['test_page_field'].forms
, который представляет собой список объектов формы Django, где можно выполнять регулярные проверки и использовать метод .add_error()
.Соответствующий base_form_class
будет выглядеть следующим образом:
class TestPageForm(WagtailAdminPageForm):
def clean(self):
cleaned_data = super().clean()
#loop over linked orderables
for form in self.formsets['test_page_field'].forms:
#check first if form is valid, otherwise cleaned_data will not be accesible/set
if form.is_valid():
cleaned_form_data = form.clean()
testPageFieldFieldTitle = cleaned_form_data.get('testPageFieldFieldTitle')
#execute some validation condition, and raise the error if it fails
if testPageFieldFieldTitle is None:
form.add_error('testPageFieldFieldTitle', 'please dont leave me empty')
return cleaned_data
Надеюсь, это поможет.