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



我按照Wagtail站点的说明将Wagtail添加到现有的Django项目中。在指令的最后,它说:

请注意,在不使用Wagtail项目模板时有一个小区别:Wagtail创建了一个基本类型Page的初始主页,其中不包括标题之外的任何内容字段。你可能想用你自己的主页类来代替它——当你这样做时,请确保你设置了一个网站记录(在Wagtail管理员的"设置/网站"下)来指向新主页。

我想将"基本类型页面"更改为我的模型类BlogIndex。我知道我可以添加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管理中的页面时,我得到了错误:

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_tent_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的行,然后再删除。迁移后我做的唯一一件事就是运行服务器,以确保它正常工作。

很明显,我还错过了让它发挥作用的一两步,假设这是可能的。知道它们可能是什么吗?

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_logindex表更改为:

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_pagerevi_page_id_d421cc1d_fk_ wagtailco";在桌子上";wagtailcore_pagerevision";细节:键(id)=(5)仍然从表"中引用;wagtailcore_pagerevision";。

在意识到我误读了@gasman措辞清晰的回应后,我在blog_blogindex:中添加了第二行

5,<p>Introduction</p>
2,<p>unused page</p>

只需要有一个条目:第二个条目。我将wogtailcore_page中作为设置一部分创建的行的7改为28。Wagtail运行时没有出现错误,默认页面使用BlogIndex类。

我还有一个问题:站点行被删除了。我确信这是我删除了它所指向的页面的结果。我在设置中更改了默认主页。我只是把那一排加了回来,我做得很好。我应该先把网站的一排改回来。

The Fix

  1. 按照Wagtail说明将Wagtail添加到您的项目中
  2. 为要使用的主页/主页添加一个模型类。我在一个单独的应用程序中设置了我的
  3. 运行makemigrations并迁移
  4. 此时您应该备份数据库,以防在接下来的步骤中出现严重错误。您将手动更改表数据
  5. 访问数据库并将行添加到新创建的类表中,如@gasman所述
  6. 将第二行wagtailcore_page中的content_type_id列更改为新建类的id。应该只有两行,第一行是根。您可以在django_content_type表中找到id
  7. 提交更改并运行应用程序

缺少的步骤是在blog_blogindex表中创建一个page_ptr_id=2的条目,以伴随wagtailcore_page记录。Wagtail对Page对象使用多表继承,因此BlogIndex实例的数据在wagtailcore_page(包含所有Page模型的公共字段)和blog_blogindex(包含BlogIndex上专门定义的字段)之间进行分割。

然而,我不知道有任何方法可以通过Django ORM作为独立操作创建blog_blogindex条目——如果你尝试它,它会同时尝试创建一个新的wagtailcore_page条目。独立项目中的"主页"应用程序(在0002_create_homepage迁移中)通过删除旧的Page实例并创建一个主页来替换它(同时在wagtailcore_pagehome_homepage中创建条目)来解决此问题,这导致ID 2丢失。如果您真的想在自己的应用程序中避免这个删除/重新创建步骤,那么您可能必须使用原始SQL INSERT查询创建blog_blogindex条目。

最新更新