【问题标题】:Change Default Homepage When Adding Wagtail to an Existing Django Project将 Wagtail 添加到现有 Django 项目时更改默认主页
【发布时间】: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 类。

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

修复

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

【问题讨论】:

    标签: django wagtail


    【解决方案1】:

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

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

    【讨论】:

    • 第二步导致了不同的错误。我将结果添加到我的问题中。在这一点上,尝试是为了满足我的好奇心,这是可能的。对数据库进行多次手动更改可能会在 Wagtail 的未来版本中对我不利。
    • 将content_id从1改为28时,需要在blog_blogindex中创建对应的entry,使数据一致。如果 wagtailcore_page 中有两个带有 content_id 的条目,则需要 blog_blogindex 中有两个条目。通过更新现有记录的 page_ptr_id,您所做的只是将不一致从一页移到另一页。
    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多