在 WagTail 中使用 Stream Field 会抛出块内容错误
Using Stream Field in WagTail throws an error in block content
我遵循 this WagTail
的官方教程。现在我想将 BlogPage
body
列从 RichText
更改为 models.py
中的 StreamField
。
我按照 this 手册使其工作。
我把BlogPage
class改成了这样
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"),
]
现在我可以在 Wegtail
的 Admin
页面中编辑 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 %}
我遵循 this WagTail
的官方教程。现在我想将 BlogPage
body
列从 RichText
更改为 models.py
中的 StreamField
。
我按照 this 手册使其工作。
我把BlogPage
class改成了这样
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"),
]
现在我可以在 Wegtail
的 Admin
页面中编辑 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 %}