Трясогузка Показать последние сообщения в блоге на домашней странице через поток
У меня есть 3 раздела на моем сайте, домашняя страница, индекс блога и блог. Я использую функцию 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'),
]
В моей папке блоков я вызываю файл нормально, и он прекрасно отображает оболочку, но я не могу получить какие-либо данные, я пробовал несколько способов, но ничего не возвращается.
{% 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>
Для страницы блога Index, которая работает, я делаю следующее.
{% 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 %}
1 ответ
Определение ваших собственных методов на StructBlock
не будет работать - self
(или же value
) переменная, которую вы получаете в шаблоне, является простым указанием, а не самим объектом StructBlock. (Это может показаться нелогичным, но это согласуется с тем, как блоки работают в целом: просто как CharBlock
дает вам строковое значение для работы, а не CharBlock
пример, StructBlock
дает вам скорее диктат, чем StructBlock
пример.)
Вместо этого вы можете определить get_context
метод ( как описано здесь) для предоставления дополнительных переменных в шаблон:
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 %}
,