Как получить предков страниц в WagtailAdminPageForm для несохраненных экземпляров страниц? - PullRequest
0 голосов
/ 25 июня 2019

Я хотел бы получить страницы предков текущей страницы в моей настраиваемой форме администратора :

# models.py
class TopicPage(Page):

    def get_topic_path(self):
        return (
            self
            .get_ancestors(inclusive=True)
            .filter(depth__gt=3)
            .values_list('title', flat=True)
        )

    base_form_class = TopicPageForm

# forms.py
class TopicPageForm(WagtailAdminPageForm):

    def save(self, commit=True):
        page = super().save(commit=False)

        page.get_topic_path()

        if commit:
            page.save()
        return page

Но с новыми TopicPage экземплярами get_ancestors не возвращают ничего, пока страница не будет сохранена:

  1. Добавить новый TopicPage объект
  2. Опубликовать эту страницу: get_ancestors возвращает пустой набор запросов
  3. Опубликуйте эту страницу еще раз: get_ancestors возвращает ожидаемый набор запросов

Как получить страницы-предки текущей страницы в методе WagtailAdminPageForm save (), даже для новых (несохраненных) страниц?

1 Ответ

0 голосов
/ 25 июня 2019

Когда создается экземпляр WagtailAdminPageForm при добавлении / редактировании страниц Wagtail, ему передается родительская страница; это тогда доступно на объекте формы как self.parent_page. Wagtail использует это для проверки уникальности слага страницы, но вы также можете использовать его в своем пользовательском методе save - в этом случае вы можете повторить get_topic_path, вызвав .get_ancestors(inclusive=True) на родительской странице и добавив page.title к результату.

...