【发布时间】:2020-06-12 23:58:04
【问题描述】:
我关注了 Wagtail 网站上的 instructions,将 Wagtail 添加到现有的 Django 项目中。在说明的最后,它说:
请注意,不使用 Wagtail 项目模板时有一个小区别:Wagtail 创建一个基本类型 Page 的初始主页,其中不包括标题之外的任何内容字段。您可能希望将其替换为您自己的 HomePage 类 - 当您这样做时,请确保您设置了一个站点记录(在 Wagtail 管理员的 Settings / Sites 下)以指向新主页。
我想将“基本类型页面”更改为我的模型类 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_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”中引用。
在意识到我误读了@gasman 措辞清晰的回复后,我在 blog_blogindex 中添加了第二行:
5,<p>Introduction</p>
2,<p>unused page</p>
只需要一个条目:第二个条目。我在 wogtailcore_page 中将作为设置的一部分创建的行的 7 更改为 28。 Wagtail 运行时没有出现错误,默认页面使用的是 BlogIndex 类。
我还有一个问题:站点行已被删除。我很确定这是我删除它指向的页面的结果。我在设置中更改了默认主页。我刚刚添加了行,我很好。我应该先把网站行改回来。
修复
- 在Wagtail instructions 之后将 Wagtail 添加到您的项目中
- 为您希望使用的主页/基本页面添加一个模型类。我在一个单独的应用程序中设置了我的。
- 运行 makemigrations 并迁移。
- 此时您应该备份您的数据库,以防在接下来的步骤中出现严重错误。您将手动更改表格数据。
- 访问数据库并将行添加到新创建的类表中,如 @gasman 所述。
- 将第二行 wagtailcore_page 中的 content_type_id 列更改为新创建的类的 id。应该只有两行,第一行是根。您可以在 django_content_type 表中找到 id。
- 提交您的更改并运行您的应用。
【问题讨论】: