1

假设我有一个很棒的 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 %}

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

有什么方法可以添加一个on_delete=PROTECTPageChooserBlock?像这样:

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',
)
4

1 回答 1

3

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

但是,目前正在进行一个拉取请求,它将识别这些案例并在页面被删除时发出警告:https ://github.com/wagtail/wagtail/pull/4702

于 2018-09-26T19:51:43.650 回答