可以在 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
假设我有一个很棒的 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