无法 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']
我在 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']