将Wagtail添加到现有Django项目时更改默认主页

问题描述 投票:0回答:1

我遵循Wagtail网站上的instructions,将Wagtail添加到现有的Django项目中。在说明的末尾,它说:

[请注意,不使用Wagtail项目模板时,有一个小的区别:Wagtail创建基本类型Page的初始首页,该首页不包括标题之外的任何内容字段。您可能要用自己的HomePage类替换它-这样做时,请确保您设置了一个网站记录(在Wagtail管理员中的Settings / Sites下)以指向新的首页。

我想将'基本类型Page'更改为我的模型类BlogIndex。我知道我可以将BlogIndex添加为默认页面的子页面,然后按照说明中的说明指向它。相反,我想更改现有页面。困扰我的是在根目录下有一个未使用的页面。仅使用它会是一种更清洁的方法。

添加新类并进行迁移后,django_content_type表如下所示:

1,admin,logentry
2,auth,permission
3,auth,group
4,auth,user
5,contenttypes,contenttype
6,sessions,session
7,wagtailcore,page
8,wagtailadmin,admin
9,wagtaildocs,document
10,wagtailimages,image
11,wagtailforms,formsubmission
12,wagtailredirects,redirect
13,wagtailembeds,embed
14,wagtailusers,userprofile
15,wagtailimages,rendition
16,wagtailimages,uploadedimage
17,wagtailsearch,query
18,wagtailsearch,querydailyhits
19,wagtailcore,grouppagepermission
20,wagtailcore,pagerevision
21,wagtailcore,pageviewrestriction
22,wagtailcore,site
23,wagtailcore,collection
24,wagtailcore,groupcollectionpermission
25,wagtailcore,collectionviewrestriction
26,taggit,tag
27,taggit,taggeditem
28,blog,blogindex

还有另一个表:wagtailcore_pages包含三行:

1,0001,1,1,Root,root,true,false,/,"",false,"",,,false,7
3,000100010001,3,0,Blog Index,blog-index,true,false,/blog/blog-index/,"",false,"",,,false,28
2,00010001,2,1,Welcome to your new Wagtail site!,home,true,false,/blog/,"",false,"",,,false,7

最后一列是content_type_id,它映射到上表。我尝试将值从7更改为28。当我在Wagtail admin中访问该页面时,出现了错误:

DoesNotExist at /cms/pages/2/
BlogIndex matching query does not exist.
Request Method: GET
Request URL:    http://localhost:8006/cms/pages/2/
Django Version: 3.0.7
Exception Type: DoesNotExist
Exception Value:    
BlogIndex matching query does not exist.
Exception Location: /Users/curt/htdocs/zetcho/venv/lib/python3.8/site-packages/django/db/models/query.py in get, line 415
Python Executable:  /Users/curt/htdocs/zetcho/venv/bin/python
Python Version: 3.8.2

这发生在我添加您在wagtailcore_pages中看到的BlogIndex页面之前和之后。两者都是在我运行迁移以将其添加到模型之后。当我将其更改回7时,一切恢复正常。我的猜测是它在错误的位置寻找模型。

然后,我创建了一个独立的Wagtail应用,以了解它的不同之处。 django_content_type表的开始看起来像这样:

1,wagtailcore,page
2,home,homepage
3,wagtailadmin,admin

app_label'home'是wagtail进程创建的应用程序的名称。家用应用程序包含一个带有HomePage类的模型文件。

独立应用程序的wagtailcore_pages包含两行:

1,0001,1,1,Root,root,1,0,/,"",0,"",,,0,1
3,00010001,2,0,Home,home,1,0,/home/,"",0,"",,,0,2

有趣的是,第二行的ID为3(第一列为ID)。鉴于该字段是自动递增的,因此必须先添加然后删除ID为2的行。迁移之后,我要做的唯一事情就是运行runserver以确保其正常工作。

显然,我想再做一两个步骤就可以使它正常工作。知道它们可能是什么吗?

Wagtail网站上有一张两到三年的票证,涉及默认页面的设置,但在解决方案上。

更新

我尝试了我认为是@gasman的解决方案。 wagtail_core_page现在看起来像这样:

1,0001,1,1,Root,root,true,false,/,"",false,"",,,false,7
5,000100010001,3,0,Blog Index,blog-index,true,false,/blog/blog-index/,"",false,"",,,false,28
2,00010001,2,1,Welcome to your new Wagtail site!,home,true,false,/blog/,"",false,"",,,false,28

这里唯一的变化是将第二行的页面类型设置为28。我也将blog_blogindex表更改为此:

2,<p>Introduction</p>

第一列是五个。我已经添加和删除了几次,因此五次。我将/ cms添加到url时,我停止并重新启动了该应用程序,并收到以下错误:

KeyError at /cms/
5
Request Method: GET
Request URL:    http://localhost:8006/cms/
Django Version: 3.0.7
Exception Type: KeyError
Exception Value:    
5
Exception Location: /Users/curt/htdocs/zetcho/venv/lib/python3.8/site-packages/wagtail/core/query.py in specific_iterator, line 403
Python Executable:  /Users/curt/htdocs/zetcho/venv/bin/python
Python Version: 3.8.2

我的猜测是因为我在上面的wagtail_core表中仍然有第三行。我有该行以便使一行显示在blog_blogindex表中。接下来,我尝试删除其中包含五行的行,并收到一个postgre / SQL错误:

[[23503]错误:对表“ wagtailcore_page”的更新或删除违反了对表“ wagtailcore_pagerevision”的外键约束“ wagtailcore_pagerevi_page_id_d421cc1d_fk_wagtailco”的详细信息:键(id)=(5)仍从表“ wagtailcore_pagerevision”引用。

我停在那里。我可以删除wagtailcore_pagrevision中的行。只是为了摆脱未使用的表行,这是太多的更改。

django wagtail
1个回答
0
投票

缺少的步骤是在blog_blogindex表中创建一个page_ptr_id = 2的条目,以伴随wagtailcore_page记录。 Wagtail将multi-table inheritance用于Page对象,因此BlogIndex实例的数据在wagtailcore_page(其中包含所有Page模型的公共字段)和blog_blogindex(其中特别包含BlogIndex上定义的字段)之间划分。

但是,我不知道有任何方法可以通过Django ORM作为独立操作创建blog_blogindex条目-如果您尝试这样做,它将尝试同时创建新的wagtailcore_page条目。独立项目中的“ home”应用通过删除旧的Page实例并创建一个Homepage来替换它(在0002_create_homepagewagtailcore_page中都创建条目)来解决此问题(在home_homepage迁移中)。缺少的ID2。如果您确实想避免在自己的应用程序中执行此删除/重新创建步骤,则可能必须使用原始SQL INSERT查询创建blog_blogindex条目。

© www.soinside.com 2019 - 2024. All rights reserved.