Python 在WagtailCMS的InlinePanel中是否有对相关订单进行验证的方法?

Python 在WagtailCMS的InlinePanel中是否有对相关订单进行验证的方法?,python,django,validation,wagtail,Python,Django,Validation,Wagtail,我正在使用Wagtail CMS,我需要对我的Orderable模型进行一些验证。例如,确保最多填充一个字段 通常,我会覆盖Django模型的clean(self)方法,但在该方法中调用super().clean()将返回None。我仍然能够使用self.field\u name访问字段,并且提升ValidationError仍然会阻止创建模型,但它不会显示是哪些字段导致了管理界面中的模型错误 我已尝试重写clean方法,该方法停止提交模型,但不会在界面上显示错误 我尝试了以下方法,但是那里的c

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

通常,我会覆盖Django模型的
clean(self)
方法,但在该方法中调用
super().clean()
将返回
None
。我仍然能够使用
self.field\u name
访问字段,并且提升
ValidationError
仍然会阻止创建模型,但它不会显示是哪些字段导致了管理界面中的模型错误

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

我尝试了以下方法,但是那里的
clean
方法甚至没有为
Orderable
调用

这是我的
clean
方法的示例

def清洁(自清洁):
super().clean()
has_image=self.image不是无
has\u video=self.video\u url不是无
如果has_image==has_video:
raise ValidationError('必须设置视频或图像')

我希望验证错误会出现在管理界面中。

我已经深入研究了wagtail源代码,我想我找到了访问orderable表单控件的方法

假设你有一个页面模型

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')
    ]
然后,您可以在页面的clean方法中,通过
self.formsets['test\u page\u field'].forms
,这是Django表单对象的列表,可以在其中执行定期检查,并且可以使用
.add\u error()
方法。相关的
base\u form\u 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
我希望这有帮助