Использование 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 %}
Вернуться на верх