无法 link 博客 post 到其在 Wagtail 中的内容页面

Unable to link blog post to its content page in Wagtail

我在 wagtail 中创建博客 Post 的 link 到它自己的内容页面时遇到问题。在我的模型中,我有两个页面 classes,BlogPage 和 IndexPage。我的 BlogPage class 用于创建博客 post,IndexPage class 用于显示博客列表 post。

请查看以下型号:

from django.db import models

from modelcluster.fields import ParentalKey

from wagtail.wagtailcore.models import Page, Orderable
from wagtail.wagtailcore.fields import RichTextField
from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, InlinePanel
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
from wagtail.wagtailsearch import index


class IndexPage(Page):
    intro = RichTextField(blank=True)

    def child_pages(self):
        return BlogPage.objects.live()


    content_panels = Page.content_panels + [
        FieldPanel('intro', classname='full'),
    ]

    subpage_types = ['blog.BlogPage']


class BlogPage(Page):
    date = models.DateField("Post date")
    intro = models.CharField(max_length=250)
    body = RichTextField(blank=True)



    search_fields = Page.search_fields + (
    index.SearchField('intro'),
    index.SearchField('body'),
    )

    content_panels = Page.content_panels + [
    FieldPanel('date'),
    FieldPanel('intro'),
    FieldPanel('body', classname="full")
    ]

我的挑战是我不知道如何 link 索引页面上的博客 post 到它自己的页面。我是否需要创建单独的页面模型和 html 模板来实现此目的?或者什么是解决这个问题的最佳方法?

您可以创建一个包含模板(它不需要模型)- 我们将其命名为 truncated_blog_post.html - 然后您可以在 index_page.html 模板中调用它。这是推荐的方法,因为对 post 使用包含模板可以在任何需要显示(通常被截断)post 列表的地方使用它:当您想要 posts 在某个标签下,例如。

truncated_blog_post.html

{% load wagtailcore_tags %}

<article>
  <a href="{% pageurl blog %}"><h2>{{ blog.title }}</h2></a>
  <p>{{ blog.date }}</p>
  <p>{{ blog.body|truncatewords:40 }}</p>
</article>

使用 wagtailcore_tags 中的 pageurl 标签,您可以获得该博客 post 的相关 URL。显然,如果您不想为截断的 post 创建包含模板,您可以将 blog_post.html 中的 article 代码直接放在 index_page.html 的 for 循环中模板。

还有你的index_page.html模板:

....
{% for blog in blogs %}
  {% include "path/to/includes/truncated_blog_post.html" %}
{% empty %}
  No posts found
{% endfor %}
....

为此,您必须修改 IndexPage 模型:

class IndexPage(Page):
    intro = RichTextField(blank=True)
    @property
    def blogs(self):
        blogs = BlogPage.objects.live()
        return blogs
    def get_context(self, request):
        # Get blogs
        blogs = self.blogs

        # Update template context
        context = super(IndexPage, self).get_context(request)
        context['blogs'] = blogs
        return context

    content_panels = Page.content_panels + [
    FieldPanel('intro', classname='full'),
    ]
    subpage_types = ['blog.BlogPage']