Link 到 Wagtail CMS 中的特定页面

Link to specific page in Wagtail CMS

在 Wagtail CMS 中,我不知道如何为特定页面构建 link。我想要一个(固定的,未创作的)link 在模板中从我的 BlogIndexPage 到我的 BlogIndexArchivePage,反之亦然。 在官方文档中 pageurl 看起来很有前途:

{% load wagtailcore_tags %}
...
<a href="{% pageurl self.blog_page %}">

但是我不理解blog_page这个符号,但是page-classes的命名方式类似于BlogPageBlogIndexPage。我是否必须在我的 models.py 中定义要 link 的页面 - 如果是这样:如何?

在我给出详细答案之前,我会提出一个简单的建议:假设您已经为您的博客索引和博客存档页面提供了合理的 URLs,例如 /blog//blog/archive/,有什么理由相信它们永远会改变吗?如果没有,那么只需在您的模板上写一个硬编码的 <a href="/blog/"> link 并忘记它。这似乎是一种逃避,但您将需要 一些 持久的方法来指定特定页面作为博客索引——无论是基于页面类型、ID 还是站点结构中的位置 - 通过 URL 执行此操作可能比您可以想出的任何其他机制更明智和面向未来。 URLs 应该是持久标识符,毕竟...


好的。详细答案:

pageurl 文档的示例中,self.blog_page 只是一个引用 Page 对象的变量。如果您有这样的设置,这就是您要使用的内容,其中 blog_page 是您页面的一个字段,指向其他页面:

class ExamplePage(Page):
    body = RichTextField()
    blog_page = models.ForeignKey('wagtailcore.Page')

    content_panels = Page.content_panels + [
        FieldPanel('body'),
        PageChooserPanel('blog_page'),
    ]

但是,在您的情况下,您希望以编程方式确定 linked 页面,而不是创作页面内容的一部分,因此您需要一些其他方式来获取相关 Page 对象.

当您谈论 "my BlogIndexPage" 时,您是在暗示该类型的页面在任何时候都只会存在于您的网站上。如果这确实是一个有效的假设,那么用于检索该页面的合适的 Django 表达式将是:BlogIndexPage.objects.first()。 (如果这不是一个有效的假设,那么您需要自己决定您的网站如何选择一个特定的 BlogIndexPage 作为 博客索引。)

您现在需要使该页面对象在您的模板上可用。一种方法是通过 get_context 方法:

class ExamplePage(Page):
    body = RichTextField()

    def get_context(self, request):
        context = super(ExamplePage, self).get_context(request)
        context['blog_index'] = BlogIndexPage.objects.first()
        return context

这使得它在模板上作为变量 blog_index 可用,允许您编写:{% pageurl blog_index %}.

slugurl 应该容易得多。例如,{% slugurl 'blog_index'%}

pageurl 需要一个页面对象,该对象必须在提问模板中可用。