将 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 }}
等在模板中使用内容...
我使用 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 }}
等在模板中使用内容...