【问题标题】:Is there a way to perform validation on related Orderable in InlinePanel in WagtailCMS?有没有办法在 WagtailCMS 的 InlinePanel 中对相关的 Orderable 执行验证?
【发布时间】:2019-02-10 17:07:13
【问题描述】:

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

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

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

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

这是我的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')

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

【问题讨论】:

    标签: python django validation wagtail


    【解决方案1】:

    我已经深入研究了 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
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2010-11-26
      • 2019-12-16
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多