8

在 Wagtail CMS 中,我不知道如何构建指向特定页面的链接。我希望模板中有一个(固定的,非创作的)链接,从我BlogIndexPage到我BlogIndexArchivePage,反之亦然。在官方文档中 pageurl看起来很有希望:

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

但我不明白符号blog_page,但page-classes命名为BlogPageor BlogIndexPagemodels.py我是否必须在我的- 如果是这样:如何定义我要链接到的页面?

4

2 回答 2

16

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


好的。详细答案:

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'),
    ]

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

当您谈论“我的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 %}.

于 2015-08-02T01:44:56.133 回答
7

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

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

于 2017-04-13T01:57:35.223 回答