在 WagTail 中使用 Stream Field 会抛出块内容错误

Using Stream Field in WagTail throws an error in block content

我遵循 this WagTail 的官方教程。现在我想将 BlogPage body 列从 RichText 更改为 models.py 中的 StreamField。 我按照 this 手册使其工作。

我把BlogPageclass改成了这样

class BlogPage(Page):
    date = models.DateField("Post date")
    intro = models.CharField(max_length=250)
    tags = ClusterTaggableManager(through=BlogPageTag, blank=True)
    categories = ParentalManyToManyField('blog_app.BlogCategory', blank=True)

    body = StreamField([
        ('heading', blocks.CharBlock(form_classname="full title")),
        ('paragraph', blocks.RichTextBlock()),
        ('image', ImageChooserBlock()),
    ])


    def main_image(self):
        gallery_item = self.gallery_images.first()
        if gallery_item:
            return gallery_item.image
        else:
            return None

    search_fields = Page.search_fields + [
        index.SearchField('intro'),
        index.SearchField('body'),
    ]

    content_panels = Page.content_panels + [
        MultiFieldPanel([
            FieldPanel('date'),
            FieldPanel('tags'),
            FieldPanel('categories', widget=forms.CheckboxSelectMultiple),
        ], heading="Blog information"),
        FieldPanel('intro'),
        StreamFieldPanel('body', classname="full"),
        InlinePanel('gallery_images', label="Gallery images"),
    ]

现在我可以在 WegtailAdmin 页面中编辑 StreamField

我将 base.html 的内容从

更改为

{% block content %}{% endblock %}

{% include_block page.body %} 不抛出错误。

现在我可以在 post 中看到 StreamField 的内容。但是因为我替换了 {% block content %},所以我看不到任何其他内容(就像 blog_index_page.html 上的所有 post)。 但是因为 blog_index_page 正在循环 posts 我必须在 base 中包含 {% include_block page.body %} 才能正确呈现 StramField 的内容并且不会抛出块内容需要字符串的错误。

我的架构与教程站点相同。

错误信息是:

'richtext' template filter received an invalid value; expected string, got <class 'wagtail.core.blocks.stream_block.StreamValue'>.

不要替换 base.html 中的 {% block content %}{% endblock %} 行。这是所有页面类型共享的基本模板,因此它应该只包含对所有页面类型有意义的内容,例如 <title> 标记 - {% block content %} 是各个模板 (blog_index_page.html 和 blog_page.html) 将用于插入自己的内容。有关更多说明,请参阅 Template inheritance

要更改的正确行是:

  • 在 blog_page.html 中:{{ page.body|richtext }} 变为 {% include_block page.body %}
  • 在 blog_index_page.html 中:{{ post.specific.body|richtext }} 变为 {% include_block post.specific.body %}