在Wagtail

时间:2018-02-25 12:41:37

标签: django wagtail wagtail-streamfield

我尝试在页面中呈现子页面的StreamField。我无法在StreamField中渲染不同的StructField。这是我的代码

class DefinitionPage(Page):

body = StreamField([
    ('definition', blocks.StructBlock([
        ('heading', blocks.CharBlock(label='Titre')),
        ('paragraph', blocks.RichTextBlock(label='Paragraphe')),
    ]))
])

content_panels = Page.content_panels + [
    StreamFieldPanel('body'),
]

我的模板。 (DefinitionPage是此页面的子项。)

{% for post in page.get_children %}
    <h2><a href="{% pageurl post %}">{{ post.title }}</a></h2>
    {% for block in post.body %}
        {% include_block block %}
    {% endfor %}
{% endfor %}

post.title还可以,但它就像post.body中没有阻止一样。 我尝试了很多东西,{%include_block block%}肯定是错的。我还尝试为StructBlock添加自定义模板但没有成功。

我该怎么办?我正在使用Django 2.0和wagtail 2.0(我不知道w,但我读了doc) 最好的问候

2 个答案:

答案 0 :(得分:0)

您需要使用Alternative - page.get_children.specific仅返回所有网页类型共有的基本get_children信息,其中不包含{{1}中的Page字段}}

答案 1 :(得分:0)

谢谢,我改变了我的代码 在父PageModel中,我添加了:

def get_context(self, request):
    context = super().get_context(request)
    definitions = self.get_children().specific()
    context['definitions'] = definitions
    return context

现在在我的模板中:

{% for definition in definitions %}
    {% for block in definition.body %}
        {%  include_block block %}
    {% endfor %}
{% endfor %}

我还为我的定义创建了一个自定义模板(简单就是测试):

{% load wagtailcore_tags %}

<div class="definition">
    <h2>{{ value.bound_blocks.heading }}</h2>
    {{ value.bound_blocks.paragraph }}
</div>

非常感谢

最后一个问题:有更好的做法吗? .specific在模板或自定义get_context()?将自定义模板添加到StructBlock是一个好习惯吗?