有没有办法在 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
希望对您有所帮助。
我正在使用 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
希望对您有所帮助。