链接到Wagtail CMS中的特定页面

tom*_*eit 5 wagtail

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

{% load wagtailcore_tags %}
...
<a href="{% pageurl self.blog_page %}">
Run Code Online (Sandbox Code Playgroud)

但是我不明白这个符号blog_page,但它page-classes的名字是BlogPage或者BlogIndexPage.我是否必须定义我将链接到的页面models.py- 如果是这样的话:如何?

gas*_*man 10

在我给了详细的解答,我将做一个简单的建议:假设你已经给你的博客索引和博客存档页面的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'),
    ]
Run Code Online (Sandbox Code Playgroud)

但是,在您的情况下,您希望以编程方式确定链接页面,而不是创作页面内容的一部分,因此您需要一些其他方式来获取相关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
Run Code Online (Sandbox Code Playgroud)

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


Dat*_* TT 7

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

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