【发布时间】:2017-03-27 07:13:17
【问题描述】:
我想以编程方式为已知父级创建一个子页面。我怎样才能做到这一点?页面创建将在信号接收器中进行:该页面是在另一个页面发布时创建的。
【问题讨论】:
标签: wagtail
我想以编程方式为已知父级创建一个子页面。我怎样才能做到这一点?页面创建将在信号接收器中进行:该页面是在另一个页面发布时创建的。
【问题讨论】:
标签: wagtail
也添加一个修订。
from wagtail.wagtailcore.models import Page
from models import MyPage
home = Page.objects.get(id=3) # or better Page query
my_page = models.MyPage(title="test", body="<h1>the body</h1>")
home.add_child(instance=my_page)
# later when a cms user updates the page manually
# there will be no first revision to compare against unless
# you add a page revision also programmatically.
my_page.save_revision().publish()
您可以在 wagtailadmin 页面创建视图(第 156 行)中查看 wagtail 是如何做到这一点的。 https://github.com/wagtail/wagtail/blob/stable/1.13.x/wagtail/wagtailadmin/views/pages.py
2018 年 9 月 18 日更新: 我建立了一个 700 页的网站,其中包括 200 个生成的页面。我从未在任何地方添加初始修订,也没有编辑抱怨。在第一次手动编辑之后会有一个修订。如果您认为可追溯性需要,请继续添加初始修订。
以编程方式创建页面:
page = SomePageType(title="My new page", body="<p>Hello world</p>") # adjust fields to match your page type
parent_page.add_child(instance=page)
【讨论】:
以下是我以编程方式创建多语言页面结构的完整代码。它将用 LanguageRedirectionPage 实例替换“Wagtail 欢迎页面”。
有关多语言页面的更多信息: Wagtail Docs - Internationalization
页面结构如下:
在代码末尾创建的 Site 实例指向 LanguageRedirectionPage 实例。这是我们应用程序的入口点。
# Deletes existing pages and sites
Site.objects.all().delete()
Page.objects.filter(pk=2).delete() # Deletes Wagtail welcome page
root_page = Page.objects.filter(pk=1).get()
# Adds a LanguageRedirectionPage as a child of the Root Page
app_name = '[Your Project Name]'
page_slug = app_name.lower().replace(" ", "")
sub_root_page = LanguageRedirectionPage(
title=app_name,
draft_title=app_name,
slug=page_slug,
live=True,
owner=account,
)
root_page.add_child(instance=sub_root_page)
sub_root_page.save_revision().publish()
# Adds some language pages
for code,caption in dict(settings.LANGUAGES).items():
print(code, caption)
sub_root_page.add_child(instance=Page(
title=caption,
slug=code,
live=True,
owner=account,
))
# Adds a new Site instance (See Settings -> Sites in your Wagtail admin panel)
Site.objects.create(
hostname='localhost',
port='80',
site_name=app_name,
root_page=sub_root_page,
is_default_site=True,
)
【讨论】: