Возможно ли иметь on_delete = PROTECT на PageChooserBlock? - PullRequest
0 голосов
/ 26 сентября 2018

Допустим, у меня есть потрясающий проект Wagtail.В этом проекте мне нужна страница, на которой я могу добавить неограниченное количество страниц в виде ссылок, код будет выглядеть следующим образом:

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

Как вы видите, у меня есть StreamField с PageChooserBlock, который я могу добавить.

Мой шаблон выглядел бы так:

{% 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 голосов
/ 26 сентября 2018

Это невозможно в текущих версиях Wagtail - данные StreamField хранятся в виде строки JSON, что затрудняет идентификацию мест, на которые ссылается идентификатор страницы в этих данных, и, конечно, не то, что может быть применено на уровне базы данных.

Однако в настоящее время в работе находится запрос на извлечение, который определит эти случаи и предупредит о них в момент удаления страницы: https://github.com/wagtail/wagtail/pull/4702

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...