是否有一种方法可以对WagtailCMS中的InlinePanel中的相关Orderable执行验证?

时间:2019-02-10 17:07:14

标签: python django validation wagtail

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

通常,我会为Django模型覆盖clean(self)方法,但是在该方法中调用super().clean()会返回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')

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

1 个答案:

答案 0 :(得分:0)

我已经研究了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')
    ]

然后,您可以在页面的clean方法中通过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

我希望这会有所帮助。