Использование Stream Field в WagTail приводит к ошибке в содержимом блока
Я следовал этому официальному руководству для WagTail
. Теперь я хочу изменить колонку BlogPage
body
с RichText
на StreamField
в models.py
.
Я следую этому руководству, чтобы все получилось.
Я изменил класс BlogPage
, чтобы он выглядел следующим образом
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"),
]
Теперь я могу редактировать StreamField
на Admin
странице Wegtail
.
Я изменил содержимое base.html
из
{% block content %}{% endblock %}
to
{% include_block page.body %}
, чтобы не выкидывать ошибку.
Теперь я могу видеть содержимое StreamField
в своем посте. Но поскольку я заменил {% block content %}
, я не могу видеть ничего другого (например, все сообщения на blog_index_page.html
).
Но так как blog_index_page
зацикливает posts
, я должен включить {% include_block page.body %}
в базу, чтобы правильно отобразить содержимое StramField
и не выдать ошибку, что в содержимом блока ожидается строка.
Моя архитектура такая же, как и на сайте учебника.
Не заменяйте строку {% block content %}{% endblock %}
в файле base.html. Это базовый шаблон, общий для всех типов страниц, поэтому он должен содержать только то, что имеет значение для всех типов страниц, например, тег <title>
- {% block content %}
является заполнителем, который отдельные шаблоны (blog_index_page.html и blog_page.html) будут использовать для вставки своего собственного содержимого. См. раздел Наследование шаблонов для более подробного объяснения.
Правильные строки для изменения следующие:
- в файле blog_page.html:
{{ page.body|richtext }}
становится{% include_block page.body %}
- в blog_index_page.html:
{{ post.specific.body|richtext }}
становится{% include_block post.specific.body %}