Django-Wagtail - 如何在向内容面板添加模型时 select "Choose A Page" 面板?

Django-Wagtail - How to select the "Choose A Page" panel when adding a model to the content panels?

我不确定我在这里是不是真的很厚,但我正在努力在 list of available panels 中找到这个面板。起初我以为是 PageChooserPanel 但事实并非如此。这就是我要找的:

将 link 插入 RichTextField 时可以使用此面板。它非常适合我的需要,但我似乎无法在其他任何地方找到它。

我正在尝试创建一个字段,编辑者可以借此 select 现有页面或 link 到外部 URL。然后 URL 将输入到我的模板中的 ref="{{ page.my_url }}"

此选择器在富文本之外不可用,因为页面 link 和外部 URL link 在数据库中有不同的表示 - 外部 link s 是普通的 URL 字符串,但是页面的 links 存储为指向相关页面 ID 的 ForeignKey。 (这确保了 link 不会在页面的 slug 发生变化时中断。)因此,您无法在模型上定义可以处理这两种值的字段类型。

一个常见的解决方法是并排使用两个可选字段 - 用于输入内部 links 的 PageChooserPanel 和用于外部 [=16] 的 FieldPanel(带有 URLField) =]s - 并在您的模型中包含一些逻辑,以 return URL 从任何一个填写:

class SomePage(Page):
    related_page = models.ForeignKey('wagtailcore.Page', null=True, blank=True, related_name='+', on_delete=models.SET_NULL)
    related_external_url = models.URLField("External link", blank=True)

    content_panels = Page.content_panels + [
        PageChooserPanel('related_page'),
        FieldPanel('related_external_url'),
    ]

    def related_url(self):
        if self.related_page:
            return self.related_page.url
        elif self.related_external_url:
            return self.related_external_url