Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何正确重命名wagtail页面模型_Django_Wagtail - Fatal编程技术网

Django 如何正确重命名wagtail页面模型

Django 如何正确重命名wagtail页面模型,django,wagtail,Django,Wagtail,我的wagtail应用程序中有两种型号,PageType和NewPageType,需要将PageType替换为NewPageType 我想我可以从models.py中删除PageType,然后运行迁移将其删除,然后将NewPageType重命名为PageType,并运行第二次迁移 但是,我在执行此操作时遇到了错误: [2019-01-22 23:20:26344][ERROR]内部服务器错误:/cms/ 回溯(最近一次呼叫最后一次): 文件“/…/python3.6/site packages/

我的wagtail应用程序中有两种型号,
PageType
NewPageType
,需要将
PageType
替换为
NewPageType

我想我可以从
models.py
中删除
PageType
,然后运行迁移将其删除,然后将
NewPageType
重命名为
PageType
,并运行第二次迁移

但是,我在执行此操作时遇到了错误:

[2019-01-22 23:20:26344][ERROR]内部服务器错误:/cms/
回溯(最近一次呼叫最后一次):
文件“/…/python3.6/site packages/django/core/handlers/exception.py”,第41行,内部
响应=获取响应(请求)
文件“/…/python3.6/site packages/django/core/handlers/base.py”,第187行,在“获取”响应中
response=self.process\u异常\u由\u中间件(e,请求)
[…剪断…]
文件“/…/python3.6/site packages/django/db/models/query.py”,第1121行,全部
self.\u result\u cache=list(self.\u iterable\u class(self))
文件“/…/python3.6/site packages/wagtail/core/query.py”,第397行,在特定迭代器中
按页面类型[内容类型][pk]生成页面
关键字错误:278

Django内置的迁移处理似乎没有自动更新某些内容。我不知道我在这里遗漏了什么步骤,所以我很想得到一些帮助。谢谢

这是因为Wagtail页面使用了已删除的
PageType
页面的一部分仍然存在

让我们看一看Wagtail的新安装(即
Wagtail start mysite
),它附带了
home.home
模型,并默认创建了一个
主页。我们可以查看数据库并确认数据库中确实存在条目:

sqlite> SELECT * FROM home_homepage;
page_ptr_id
3
然而它是相当空的。没有标题,没有路径,只有一个
页面\u ptr\u id
。这是因为
主页
继承自非抽象的
页面
模型。因此,该页面模型也有一个数据库表(这就是Django的工作方式)。让我们看看相应的表(自动匹配一些列):

给你

同样,在您的例子中,有
wagtailcore\u页面
myapp\u页面类型
myapp\u新页面类型
表。通过删除
PageType
模型,django创建了一个迁移,然后删除了
myapp\u PageType
,但将条目保留在
wagtailcore\u页面
表中。因此,现在,当您加载管理界面时,Wagtail尝试加载页面#3,但失败了

因此,在删除页面模型之前,需要先删除所有页面。您可以通过在迁移中添加一个步骤来实现这一点


您仍然需要重命名第二个模型,尽管这对于Django来说可能很困难,但如果幸运的话,在
models.py
文件中重命名它,运行
makemigrations
可能足以让Django检测到它应该重命名模型。如果没有,或者您有需要重命名为的关系,则可能需要更多发票,请参阅和。

要从中恢复并能够再次加载管理员,请执行以下操作:

删除参考:

import django
django.setup()
from wagtail.core.models import PageRevision
PageRevision.objects.filter(page_id= 278).delete()
exit()
然后删除页面

django-admin dbshell
DELETE FROM wagtailcore_page WHERE id=278;

希望这能有所帮助。

我是wagtail新手,但我在重命名模型和相关模板后运行时没有遇到任何问题

python manage.py makemigrations
python manage.py migrate
也就是说,我没有重复使用像OP这样的旧名称。我可能会建议任何有此问题的人为模型想出一个新名称,并使其具有描述性

python manage.py makemigrations
python manage.py migrate