链接到Wagtail CMS中的特定页面

时间:2015-08-01 21:01:10

标签: wagtail

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

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

但我不理解符号blog_page,但page-classes的名称类似于BlogPageBlogIndexPage。我是否必须在我的models.py中定义我要链接的页面 - 如果是这样的话:怎么做?

2 个答案:

答案 0 :(得分:8)

在我给出详细答案之前,我会提出一个简单的建议:假设您已经给博客索引和博客存档页面提供了明智的网址,例如/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 %}

答案 1 :(得分:2)

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

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