在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 %}.