将 Wagtail 页面集成到现有的 Django 项目中

Integrating Wagtail pages into existing Django project

我使用 Django 构建了一个网站,我需要添加功能来编辑网站上每个页面块的每个和平。我找到了 Wagtail 并阅读了有关如何集成它的文档,并想到了通过 django 视图集成它的方式,就像这样(main 是一个应用程序名称):

main/pages.py:

...

class IndexPage(Page):
    header_title = models.CharField(...)
    header_subtitle = models.CharField(...)

...

main/views.py:

...
def view_index(request):
    pages = Page.objects.all()
    page = pages.filter(...) # somehow filter index page
    return render(
                request,
                'index.html',
                context={'page': page.specific},
                content_type='text/html')

...

以这种方式使用 Wagtail 页面并将其集成到现有的 Django 视图中是一种好方法吗?一路上能发现什么惊喜吗?

最后决定用一个StreamField。 StreamField 可用于构建页面,如下所示:

main/pages.py:

class IndexPage(Page):
    content = StreamField([
    ('title', blocks.CharBlock()),
    ('subtitle', blocks.CharBlock()),
    ...
    ])

IndexPage 是 Django 术语中的一个模型(因此我们有一个简单的数据库 table)并且内容存储为 JSON 的列表。这两件事让我们的团队了解以我们想要的方式使用它。要在 Django 视图中使用它,可以使用以下代码:

main/views.py:

...
def index_view(request):
    page = IndexPage.objects.all().first()
    return {
        'content': unify(page.content),
    }

unify - 一种从内容创建字典的特殊方法,因为内容是一个数组,标题位于 content[0] 内,副标题位于 [=13 内=], 等等...索引可以随机重新排列,这就是使用 unify 很重要的原因。应用统一后,我们可以通过属性 {{ content.title }}{{ content.subtitle }} 等在模板中使用内容...