我已经通过重命名其文件夹,导入及其所有引用(模板/索引)来更改Django中应用程序的名称.但是现在我尝试运行时遇到了这个错误python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
如何调试并解决此错误?有线索吗?
按照以下步骤更改Django中的应用程序名称:
重命名项目根目录中的文件夹
更改为您的应用程序的任何引用他们的依赖关系,即应用程序的views.py
,urls.py
"manage.py",和settings.py
文件.
django_content_type
使用以下命令编辑数据库表:UPDATE django_content_type SET app_label='
此外,如果您有模型,则必须重命名模型表.适合postgres使用ALTER TABLE
.对于mysql我也认为它是相同的(如@null_radix所提到的)
(对于Django> = 1.7)更新django_migrations
表以避免重新运行先前的迁移:UPDATE django_migrations SET app='
.注意:如果Django 1.8+需要此步骤,则存在一些争论(在评论中); 如果有人确切知道请在这里更新.
如果您models.py
的元类已app_name
列出,请确保也重命名(由@will提及).
如果您已将应用程序中的文件夹static
或templates
文件夹命名为,则还需要重命名.例如,重命名old_app/static/old_app
为new_app/static/new_app
.
要重命名django models
,您需要更改django_content_type.name
DB中的条目.对于postgreSQL使用UPDATE django_content_type SET name='
Meta点(如果使用virtualenv):值得注意的是,如果你重命名包含virtualenv的目录,你的env中可能会有几个包含绝对路径的文件,并且还需要更新.如果你遇到这样的错误ImportError: No module named ...
可能是罪魁祸首.(感谢@danyamachine提供此功能).
其他参考:您可能还想参考以下链接以获得更完整的图片
用Django和South重命名应用程序
如何将模型从一个django应用程序迁移到一个新的应用程序?
如何更改Django应用程序的名称?
与Django South向后迁移
使用Django/South重命名模型的最简单方法?
Python代码(感谢A.Raouf)自动执行上述步骤(未经测试的代码.您已收到警告!)
Python代码(感谢rafaponieman)自动执行上述步骤(未经测试的代码.您已收到警告!)
Django 1.7中的新功能是一个应用程序注册表,用于存储配置并提供内省.这个机器让你改变几个应用程序属性.
我想说的重点是,并不总是需要重命名应用程序:通过应用程序配置,可以解决冲突的应用程序.但如果您的应用需要友好命名,那么还有其他方法.
作为一个例子,我想命名我的民意调查应用程序'来自用户的反馈'.它是这样的:
apps.py
在polls
目录中创建一个文件:
from django.apps import AppConfig class PollsConfig(AppConfig): name = 'polls' verbose_name = "Feedback from users"
将默认应用配置添加到您的polls/__init__.py
:
default_app_config = 'polls.apps.PollsConfig'
有关更多应用配置:https://docs.djangoproject.com/en/1.7/ref/applications/
如果您使用PyCharm并且项目在重命名后停止工作:
编辑运行/调试配置并更改环境变量DJANGO_SETTINGS_MODULE,因为它包含您的项目名称.
转到设置/语言和框架/ Django并更新设置文件位置.
好玩的问题!我很快将不得不重命名许多应用程序,所以我做了一次试运行。
通过此方法,可以在原子步骤中取得进展,以最大程度地减少对正在重命名的应用程序上工作的其他开发人员的干扰。
有关有效的示例代码,请参见此答案底部的链接。
准备移动的现有代码:
创建一个应用程序配置(设置name
和label
为默认值)。
将应用程序配置添加到中INSTALLED_APPS
。
在所有模型上,将其显式设置db_table
为当前值。
医生迁移,因此db_table
“总是”被明确定义。
确保不需要迁移(请检查上一步)。
更改应用标签:
label
在应用程序配置中设置为新的应用程序名称。
更新迁移和外键以引用新的应用标签。
更新基于类的通用视图的模板(默认路径为
)
运行原始SQL来修复迁移和content_types
应用(不幸的是,某些原始SQL是不可避免的)。您不能在迁移中运行它。
UPDATE django_migrations SET app = 'catalogue' WHERE app = 'shop'; UPDATE django_content_type SET app_label = 'catalogue' WHERE app_label = 'shop';
确保不需要迁移(请检查上一步)。
重命名表:
删除“ custom” db_table
。
运行,makemigrations
以便django可以将表重命名为“默认”。
移动文件:
重命名模块目录。
修复导入。
更新应用程序的配置name
。
更新INSTALLED_APPS
引用应用程序配置的位置。
整理:
如果不再需要自定义应用程序配置,请删除它。
如果应用程序配置消失了,别忘了也将其从中删除INSTALLED_APPS
。
示例解决方案:我创建了app-rename-example这个示例项目,您可以在其中查看如何重命名应用,一次提交一次。
该示例使用Python 2.7和Django 1.8,但我相信同一过程至少可以在Python 3.6和Django 2.1上运行。