如何在 Wagtail 管理页面表单中获取未保存页面实例的页面祖先?

Howto get page ancestors in WagtailAdminPageForm for unsaved page instances?

我想在我的 customized admin form:

中获取当前页面的祖先页面
# 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 在保存页面之前不要 return 任何东西:

  1. 添加新的TopicPage对象
  2. 发布此页面:get_ancestors returns 空查询集
  3. 再次发布此页面:get_ancestorsreturn是预期的查询集

如何在 WagtailAdminPageForm save() 方法中获取当前页面的祖先页面,即使是新的(未保存的)页面?

WagtailAdminPageForm被Wagtail的页面add/edit视图实例化时,它被传递给父页面;然后可以在表单对象上使用 self.parent_page。 Wagtail 使用它来验证页面 slug 的唯一性,但您也可以在自定义 save 方法中使用它 - 在这种情况下,您可以通过在父级上调用 .get_ancestors(inclusive=True) 来复制 get_topic_path页,并将 page.title 附加到结果。