我正在使用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')
我希望验证错误会显示在管理界面中。
答案 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
我希望这会有所帮助。