可能在PageChooserBlock上具有on_delete = PROTECT吗?

时间:2018-09-26 19:36:17

标签: django-models wagtail wagtail-streamfield

假设我有一个很棒的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=PROTECT上添加PageChooserBlock?像这样:

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

1 个答案:

答案 0 :(得分:2)

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

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