0

我在 wagtail 中创建博客帖子到其自己的内容页面的链接时遇到问题。在我的模型中,我有两个页面类,BlogPage 和 IndexPage。我的 BlogPage 类用于创建博客文章,IndexPage 类用于显示博客文章列表。

请参阅以下型号:

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")
    ]

我的挑战是我无法弄清楚如何将索引页面上的博客文章链接到它自己的页面。我是否需要创建一个单独的页面模型和 html 模板来实现这一点?或者解决这个问题的最佳方法是什么?

4

1 回答 1

2

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

截断的_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>

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

还有你的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']
于 2016-01-12T04:25:49.377 回答