恢复Wagtail PageRevision失败:关联Inline模型存在隐藏ValidationErrors
解决Wagtail恢复页面旧版本时内联模型验证失败问题
问题原因
恢复TestPage旧版本时,系统提示“页面因验证错误无法保存”,实际是关联的内联模型TestChild的id字段触发了验证错误:“请选择有效的选项,该选项不在可用选项中”。
这是因为:当你删除旧的TestChild实例并添加新实例后,旧版本中记录的TestChild id已经从数据库中移除;而Wagtail默认生成的内联表单会将id字段设为ModelChoiceField,自动验证该id是否存在于当前数据库,导致恢复操作失败。
解决方案
自定义内联模型的表单类,跳过id字段的验证逻辑,具体实现如下:
- 创建自定义表单类,处理
TestChild的字段验证:
from django import forms from wagtail.admin.forms import WagtailModelForm from .models import TestChild class TestChildForm(WagtailModelForm): class Meta: model = TestChild fields = ['id', 'name'] widgets = { 'id': forms.HiddenInput(), } def clean_id(self): # 跳过id字段的有效性验证,恢复历史版本时无需匹配现有数据库中的id return self.cleaned_data.get('id')
- 在
TestPage的InlinePanel中指定使用该自定义表单:
from wagtail.admin.panels import InlinePanel from wagtail.models import Page from .models import TestChild class TestPage(Page): content_panels = Page.content_panels + [ InlinePanel("test_children", form_class=TestChildForm) ] parent_page_types = ["wagtailcore.Page"]
原理说明
通过自定义表单,我们将id字段设置为隐藏输入,并跳过其验证步骤。这样在恢复旧版本时,系统会直接使用版本记录中的历史数据创建或还原TestChild实例,不再验证该id是否存在于当前数据库,从而避免触发验证错误。
内容的提问来源于stack exchange,提问作者Dennis Pratter
相关产品推荐
相关产品推荐

