Link 到 Wagtail CMS 中的特定页面
Link to specific page in Wagtail CMS
在 Wagtail CMS 中,我不知道如何为特定页面构建 link。我想要一个(固定的,未创作的)link 在模板中从我的 BlogIndexPage
到我的 BlogIndexArchivePage
,反之亦然。
在官方文档中 pageurl 看起来很有前途:
{% load wagtailcore_tags %}
...
<a href="{% pageurl self.blog_page %}">
但是我不理解blog_page
这个符号,但是page-classes
的命名方式类似于BlogPage
或BlogIndexPage
。我是否必须在我的 models.py
中定义要 link 的页面 - 如果是这样:如何?
在我给出详细答案之前,我会提出一个简单的建议:假设您已经为您的博客索引和博客存档页面提供了合理的 URLs,例如 /blog/
和 /blog/archive/
,有什么理由相信它们永远会改变吗?如果没有,那么只需在您的模板上写一个硬编码的 <a href="/blog/">
link 并忘记它。这似乎是一种逃避,但您将需要 一些 持久的方法来指定特定页面作为博客索引——无论是基于页面类型、ID 还是站点结构中的位置 - 通过 URL 执行此操作可能比您可以想出的任何其他机制更明智和面向未来。 URLs 应该是持久标识符,毕竟...
好的。详细答案:
在 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'),
]
但是,在您的情况下,您希望以编程方式确定 linked 页面,而不是创作页面内容的一部分,因此您需要一些其他方式来获取相关 Page
对象.
当您谈论 "my 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 %}
.
slugurl 应该容易得多。例如,{% slugurl 'blog_index'%}
pageurl 需要一个页面对象,该对象必须在提问模板中可用。
在 Wagtail CMS 中,我不知道如何为特定页面构建 link。我想要一个(固定的,未创作的)link 在模板中从我的 BlogIndexPage
到我的 BlogIndexArchivePage
,反之亦然。
在官方文档中 pageurl 看起来很有前途:
{% load wagtailcore_tags %}
...
<a href="{% pageurl self.blog_page %}">
但是我不理解blog_page
这个符号,但是page-classes
的命名方式类似于BlogPage
或BlogIndexPage
。我是否必须在我的 models.py
中定义要 link 的页面 - 如果是这样:如何?
在我给出详细答案之前,我会提出一个简单的建议:假设您已经为您的博客索引和博客存档页面提供了合理的 URLs,例如 /blog/
和 /blog/archive/
,有什么理由相信它们永远会改变吗?如果没有,那么只需在您的模板上写一个硬编码的 <a href="/blog/">
link 并忘记它。这似乎是一种逃避,但您将需要 一些 持久的方法来指定特定页面作为博客索引——无论是基于页面类型、ID 还是站点结构中的位置 - 通过 URL 执行此操作可能比您可以想出的任何其他机制更明智和面向未来。 URLs 应该是持久标识符,毕竟...
好的。详细答案:
在 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'),
]
但是,在您的情况下,您希望以编程方式确定 linked 页面,而不是创作页面内容的一部分,因此您需要一些其他方式来获取相关 Page
对象.
当您谈论 "my 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 %}
.
slugurl 应该容易得多。例如,{% slugurl 'blog_index'%}
pageurl 需要一个页面对象,该对象必须在提问模板中可用。