3

我的网站中有 3 个主要部分,主页、博客索引和特定博客。我正在使用 wagtail 中的流场功能来订购主页中的各个部分。其中一个部分是最新的三篇博客文章。

我已经为博客索引页面这样做了,但是无法在流域中抓取最新的博客文章。

我的模型看起来像这样

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>

对于有效的博客索引页面,我执行以下操作。

{% 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 %}
4

1 回答 1

2

在 a 上定义自己的方法是StructBlock行不通的 - 您在模板上收到的self(or value) 变量只是一个普通的 dict,而不是 StructBlock 对象本身。(这可能看起来违反直觉,但它与块的一般工作方式是一致的:就像 aCharBlock给你一个字符串值而不是CharBlock实例一样,StructBlock给你一个 dict 而不是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 %}.

于 2017-08-03T08:31:45.603 回答