0

wagtail で、ブログ投稿から独自のコンテンツ ページへのリンクを作成する際に問題が発生しています。私のモデルには、BlogPage と IndexPage の 2 つのページ クラスがあります。My 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。これは、投稿にインクルード テンプレートを使用すると、投稿のリスト (通常は切り捨てられます) を表示する必要がある場所ならどこでも使用できる可能性があるため、推奨される方法です。たとえば、特定のタグの下に投稿が必要な場合などです。

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>

pageurlfrom タグを使用するwagtailcore_tagsと、そのブログ投稿の相対 URL を取得できます。明らかに、切り捨てられた投稿のインクルード テンプレートを作成したくない場合は、テンプレートの for ループにarticleコードをblog_post.html直接配置できます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 に答える