Wagtail 2.11部署至PythonAnywhere时locale_id非空错误求助
解决Wagtail 2.11迁移时
locale_id cannot be null的完整性错误 这个错误的根源是Wagtail 2.11开始强制引入了多语言本地化支持——所有Page模型都会自动关联一个Locale对象,但你自动生成的0002_create_homepage.py迁移脚本里,创建HomePage实例时没有指定必填的locale字段,触发了数据库的非空约束。
下面是具体的解决步骤:
1. 先确保Wagtail本地化表已创建
首先运行这条命令,保证wagtail.locales的迁移先执行完成,这样数据库里才有wagtailcore_locale表:
python manage.py migrate wagtail.locales
2. 修改创建首页的迁移文件
打开home/migrations/0002_create_homepage.py,做两处修改:
第一步:导入Locale模型
在文件顶部添加导入语句:
from wagtail.core.models import Locale
第二步:创建HomePage时指定locale
找到创建HomePage的代码块,修改为以下内容(适配你的德语配置):
# 获取或创建德语默认locale default_locale, created = Locale.objects.get_or_create( language_code='de' ) # 创建首页时传入locale参数 homepage = HomePage.objects.create( title="Startseite", slug='home', locale=default_locale, # 如果你的HomePage模型还有其他必填字段,也需要在这里补充 )
这里用get_or_create是为了避免重复创建Locale对象——如果你的配置已经自动生成了德语locale,就直接获取;如果没有,就创建一个。
3. 重新执行迁移
修改完成后,运行完整的迁移命令:
python manage.py migrate
额外说明
- 如果你之前尝试过迁移导致部分表已存在,不用担心,只要确保
wagtail.locales先迁移完成,修改后的迁移脚本就能正常执行。 - 你的settings配置是正确的(
wagtail.locales已加入INSTALLED_APPS,语言设置为德语),不需要调整这部分。 - Wagtail 2.11+的Page模型强制要求locale字段,所以无法通过移除locale来规避这个问题,正确关联Locale是唯一合规的解决方式。
内容的提问来源于stack exchange,提问作者Katharina
相关产品推荐
相关产品推荐

