有没有办法在 WagtailCMS 的 InlinePanel 中对相关的 Orderable 进行验证?

Is there a way to perform validation on related Orderable in InlinePanel in WagtailCMS?

我正在使用 Wagtail CMS,我需要对我的 Orderable 模型进行一些验证。比如,确保最多填写一个字段。

通常,我会覆盖 Django 模型的 clean(self) 方法,但会在该方法中调用 super().clean() returns None。我仍然可以使用 self.field_name 访问字段,并且提高 ValidationError 仍然会阻止创建模型,但它不会在管理界面中显示哪些字段导致了模型错误。

我已尝试重写 clean 方法,该方法会阻止提交模型但不会在界面上显示错误

我已经尝试遵循 this part of the guide,但是 clean 方法甚至没有为 Orderable 调用。

这是我的clean方法的例子

def clean(self):
    super().clean()
    has_image =  self.image is not None
    has_video = self.video_url is not None

    if has_image == has_video:
        raise ValidationError('Either a video or an image must be set')

我希望在管理界面中显示验证错误。

我深入研究了 wagtail 源代码,我想我找到了访问可订购表单控件的方法。

假设您有一个页面模型,

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 在页面的 clean 方法中访问它,这是一个 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

希望对您有所帮助。