在Wagtail CMS中,我不知道如何构建指向特定页面的链接。我希望从BlogIndexPage
到BlogIndexArchivePage
的模板中有一个(已修复的,未创作的)链接,反之亦然。
官方文档pageurl看起来很有希望:
{% load wagtailcore_tags %}
...
<a href="{% pageurl self.blog_page %}">
但我不理解符号blog_page
,但page-classes
的名称类似于BlogPage
或BlogIndexPage
。我是否必须在我的models.py
中定义我要链接的页面 - 如果是这样的话:怎么做?
答案 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需要一个页面对象,该对象必须在提问模板中可用。