我是Django和Wagtail的新手,正在尝试将CMS设置为加载最少的页面集,以使导航功能正常运行。简短的问题是,扩展Wagtail的Page
类型的对象没有加载,尽管数据迁移似乎成功了。
在我的情况下,我有一堆Organization
和OrganizationType
(扩展BasicObject
)以及一些Page
对象:OrganizationIndexPage
s OrganizationPage
个。我已经使用标准的dumpdata
命令转储了数据,并将包括所有页面的数据保存在initial_data.json文件中,并使用类似于接受的答案here的数据迁移方式加载了数据。问题是重新迁移后我得到了所有的Organizations和OrganizationTypes,但是没有Page对象。我什至在输出中添加了一些打印内容以进行验证:
loaded <DeserializedObject: orgs.Organization(pk=19)>
loaded <DeserializedObject: orgs.Organization(pk=20)>
loaded <DeserializedObject: orgs.OrganizationType(pk=1)>
loaded <DeserializedObject: orgs.OrganizationType(pk=2)>
loaded <DeserializedObject: orgs.OrganizationType(pk=3)>
loaded <DeserializedObject: orgs.OrganizationPage(pk=7)>
loaded <DeserializedObject: orgs.OrganizationPage(pk=8)>
loaded <DeserializedObject: orgs.OrganizationPage(pk=10)>
edit:我注意到在转储的json中,页面中缺少了一些可能需要的字段。我只是在反序列化的json对象上调用save()
。 但是,如果我将这些丢失的行放入数据库中,即使在OneToOneField
关系下,我也无法在wagtail界面中为组织创建新页面...但是它们不会使用OrganizationPage.objects.all()
出现在界面或外壳程序中(我是新手,所以也许也不使用外壳程序)。
这是示例初始json及其对应的Page模型:
# Example json
{
"model": "orgs.organizationpage",
"pk": 21,
"fields": {
"org": 14,
"body": "[{\"type\": \"paragraph\", \"value\": \"<p>Here is the body</p>\", \"id\": \"804642df-31f8-4e17-b114-cb05c4b3e265\"}]"
}
},
# Page class
class OrganizationPage(Page):
org = models.OneToOneField('orgs.Organization', on_delete=models.PROTECT)
body = StreamField([
('heading', HeadingBlock(classname="full title")),
('paragraph', blocks.RichTextBlock()),
('image', ImageChooserBlock()),
('table', TableBlock()),
])
api_fields = [
APIField('org'),
APIField('body'),
]
content_panels = Page.content_panels + [
StreamFieldPanel('body'),
]
search_fields = Page.search_fields + [
SearchField('body'),
]
settings_panels = Page.settings_panels + [
FieldPanel('org'),
]
# load_fixture function from migration
def load_fixture(apps, schema_editor):
fixture_file = os.path.join(fixture_dir, fixture_filename)
fixture = open(fixture_file, 'rb')
objects = serializers.deserialize('json', fixture, ignorenonexistent=True)
for obj in objects:
obj.save()
print("loaded {}".format(obj))
fixture.close()