You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

恢复Wagtail PageRevision失败:关联Inline模型存在隐藏ValidationErrors

解决Wagtail恢复页面旧版本时内联模型验证失败问题

问题原因

恢复TestPage旧版本时,系统提示“页面因验证错误无法保存”,实际是关联的内联模型TestChild的id字段触发了验证错误:“请选择有效的选项,该选项不在可用选项中”。

这是因为:当你删除旧的TestChild实例并添加新实例后,旧版本中记录的TestChild id已经从数据库中移除;而Wagtail默认生成的内联表单会将id字段设为ModelChoiceField,自动验证该id是否存在于当前数据库,导致恢复操作失败。

解决方案

自定义内联模型的表单类,跳过id字段的验证逻辑,具体实现如下:

  1. 创建自定义表单类,处理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')
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 00:05:02