Wagtail 通过流场在主页上显示最新的博客文章
Wagtail Show latest blog posts on Homepage through a streamfield
我的站点、主页、博客索引和特定博客中有 3 个主要部分。我在 wagtail 中使用 streamfield 函数来订购主页中的各个部分。其中一个部分用于最新的三篇博文。
我已经为博客索引页面完成了此操作,但无法在流域中获取最新的博客文章。
我的模型是这样的
class CaseStudiesIndex(Page):
def casestudies(pages):
casestudies = CaseStudyPage.objects.all().order_by('-first_published_at')
return casestudies
intro = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('intro', classname="full")
]
class LatestPosts(blocks.StructBlock):
static = blocks.StaticBlock(admin_text='Latest posts: no configuration needed.',)
def casestudies(pages):
casestudies = CaseStudyPage.objects.all().order_by('-first_published_at')[:3]
return casestudies
class Meta:
icon = 'doc-full'
label = 'Latest Posts'
template = 'blocks/_latestPosts.html'
class HomePage(Page):
blocksbody = StreamField([
('lead_banner', LeadBanner()),
('latest_posts', LatestPosts()),
('team', Team())
],null=True,blank=True)
content_panels = Page.content_panels + [
StreamFieldPanel('blocksbody'),
]
在我的块文件夹中,我调用文件正常,它可以很好地呈现包装器,但我无法获取任何数据,我尝试了很多方法,但没有任何效果 returns。
{% load wagtailcore_tags wagtailimages_tags %}
{% load static %}
<section>
<div class="wrapper__inner">
<ul>
{% for case in self.casestudies %}
{{case.title}}
{% endfor %}
{% for case in self.case_studies %}
{{case.title}}
{% endfor %}
{% for case in self.latest_posts %}
{{case.title}}
{% endfor %}
{% for case in page.casestudies %}
{{case.title}}
{% endfor %}
{% for case in page.case_studies %}
{{case.title}}
{% endfor %}
{% for case in page.latest_posts %}
{{case.title}}
{% endfor %}
</ul>
</div>
</section>
对于有效的博客索引页面,我执行以下操作。
{% extends "inner_base.html" %}
{% load wagtailcore_tags %}
{% block body_class %}template-case-studies{% endblock %}
{% block content %}
<section>
<div class="wrapper__inner">
<h1>{{self.title}}</h1>
<ul>
{% include "blocks/CaseStudiesLatestBlock.html" %}
</ul>
</div>
</section>
{% endblock %}
而工作正常的 CaseStudiesLatestBlock.html 看起来像
{% load wagtailcore_tags wagtailimages_tags %}
{% load static %}
{% for case in self.casestudies %}
<li>
<strong>{{ case.title }}</strong>
</li>
{% endfor %}
在 StructBlock
上定义您自己的方法将不起作用 - 您在模板上收到的 self
(或 value
)变量只是一个普通的字典,而不是 StructBlock对象本身。 (这可能看起来违反直觉,但它与块的一般工作方式一致:就像 CharBlock
给你一个字符串值而不是 CharBlock
实例一样,StructBlock
给你你是一个字典而不是一个 StructBlock
实例。)
相反,您可以定义一个 get_context
方法 (as documented here) 来为模板提供额外的变量:
class LatestPosts(blocks.StructBlock):
static = blocks.StaticBlock(admin_text='Latest posts: no configuration needed.',)
def get_context(self, value, parent_context=None):
context = super(LatestPosts, self).get_context(value, parent_context=parent_context)
context['casestudies'] = CaseStudyPage.objects.all().order_by('-first_published_at')[:3]
return context
然后您可以访问模板中的 casestudies
变量,例如{% for case in casestudies %}
.
我的站点、主页、博客索引和特定博客中有 3 个主要部分。我在 wagtail 中使用 streamfield 函数来订购主页中的各个部分。其中一个部分用于最新的三篇博文。
我已经为博客索引页面完成了此操作,但无法在流域中获取最新的博客文章。
我的模型是这样的
class CaseStudiesIndex(Page):
def casestudies(pages):
casestudies = CaseStudyPage.objects.all().order_by('-first_published_at')
return casestudies
intro = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('intro', classname="full")
]
class LatestPosts(blocks.StructBlock):
static = blocks.StaticBlock(admin_text='Latest posts: no configuration needed.',)
def casestudies(pages):
casestudies = CaseStudyPage.objects.all().order_by('-first_published_at')[:3]
return casestudies
class Meta:
icon = 'doc-full'
label = 'Latest Posts'
template = 'blocks/_latestPosts.html'
class HomePage(Page):
blocksbody = StreamField([
('lead_banner', LeadBanner()),
('latest_posts', LatestPosts()),
('team', Team())
],null=True,blank=True)
content_panels = Page.content_panels + [
StreamFieldPanel('blocksbody'),
]
在我的块文件夹中,我调用文件正常,它可以很好地呈现包装器,但我无法获取任何数据,我尝试了很多方法,但没有任何效果 returns。
{% load wagtailcore_tags wagtailimages_tags %}
{% load static %}
<section>
<div class="wrapper__inner">
<ul>
{% for case in self.casestudies %}
{{case.title}}
{% endfor %}
{% for case in self.case_studies %}
{{case.title}}
{% endfor %}
{% for case in self.latest_posts %}
{{case.title}}
{% endfor %}
{% for case in page.casestudies %}
{{case.title}}
{% endfor %}
{% for case in page.case_studies %}
{{case.title}}
{% endfor %}
{% for case in page.latest_posts %}
{{case.title}}
{% endfor %}
</ul>
</div>
</section>
对于有效的博客索引页面,我执行以下操作。
{% extends "inner_base.html" %}
{% load wagtailcore_tags %}
{% block body_class %}template-case-studies{% endblock %}
{% block content %}
<section>
<div class="wrapper__inner">
<h1>{{self.title}}</h1>
<ul>
{% include "blocks/CaseStudiesLatestBlock.html" %}
</ul>
</div>
</section>
{% endblock %}
而工作正常的 CaseStudiesLatestBlock.html 看起来像
{% load wagtailcore_tags wagtailimages_tags %}
{% load static %}
{% for case in self.casestudies %}
<li>
<strong>{{ case.title }}</strong>
</li>
{% endfor %}
在 StructBlock
上定义您自己的方法将不起作用 - 您在模板上收到的 self
(或 value
)变量只是一个普通的字典,而不是 StructBlock对象本身。 (这可能看起来违反直觉,但它与块的一般工作方式一致:就像 CharBlock
给你一个字符串值而不是 CharBlock
实例一样,StructBlock
给你你是一个字典而不是一个 StructBlock
实例。)
相反,您可以定义一个 get_context
方法 (as documented here) 来为模板提供额外的变量:
class LatestPosts(blocks.StructBlock):
static = blocks.StaticBlock(admin_text='Latest posts: no configuration needed.',)
def get_context(self, value, parent_context=None):
context = super(LatestPosts, self).get_context(value, parent_context=parent_context)
context['casestudies'] = CaseStudyPage.objects.all().order_by('-first_published_at')[:3]
return context
然后您可以访问模板中的 casestudies
变量,例如{% for case in casestudies %}
.