可以在 PageChooserBlock 上设置 on_delete=PROTECT 吗?

Possible to have a on_delete=PROTECT on PageChooserBlock?

假设我有一个很棒的 Wagtail 项目。 在这个项目中,我想要一个页面,我可以在其中添加无限的页面作为链接,代码如下所示:

pages = StreamField([
    ('link_page', blocks.PageChooserBlock(help_text='Link page')),
])

如您所见,我有这个带有 PageChooserBlock 的 StreamField,我可以添加它。

我的模板如下所示:

{% for block in page.pages %}
    <a href='{% pageurl block.value %}'>{{ block.value.specific.title }}</a>
{% endfor %}

但是如果有人删除其中一个 "linked" 页面,现在会发生什么。 它们将从页面流域中删除,或者至少。将显示流场,但为空。

有什么方法可以在 PageChooserBlock 上添加 on_delete=PROTECT 吗?像这样:

pages = StreamField([
    ('link_page', blocks.PageChooserBlock(help_text='Link page', on_delete=blocks.PROTECT)),
])

如果有人现在试图删除该页面,他们会收到违规错误。

例如在 ForeignKey 上完美运行:

page = models.ForeignKey(
    'wagtailcore.Page',
    null=True,
    blank=True,
    on_delete=models.PROTECT,
    related_name='',
    help_text= 'Page',
)

在当前版本的 Wagtail 中不可能 - StreamField 数据存储为 JSON 字符串,这使得很难识别在该数据中引用页面 ID 的位置,当然也不是可以识别的内容在数据库级别强制执行。

但是,目前有一个拉取请求正在处理中,它将识别这些情况并在页面被删除时发出警告:https://github.com/wagtail/wagtail/pull/4702