gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:49:02 26 4
gpt4 key购买 nike

我正在使用 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')

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

最佳答案

我深入研究了 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 表单对象列表,可以在其中进行常规检查done 并且可以使用 .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

希望对您有所帮助。

关于python - 有没有办法在 WagtailCMS 的 InlinePanel 中对相关的 Orderable 进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54618845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com