我通过重命名应用程序的文件夹,导入及其所有引用(模板/索引)来更改了Django中应用程序的名称。但是现在当我尝试运行时出现此错误python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
如何调试和解决此错误?有什么线索吗?
rename
功能将极大地帮助您。
我通过重命名应用程序的文件夹,导入及其所有引用(模板/索引)来更改了Django中应用程序的名称。但是现在当我尝试运行时出现此错误python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
如何调试和解决此错误?有什么线索吗?
rename
功能将极大地帮助您。
Answers:
请按照以下步骤在Django中更改应用的名称:
views.py
,urls.py
“manage.py”,和settings.py
文件。django_content_type
使用以下命令编辑数据库表:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
。对于MySQL我也认为它是相同的(如@null_radix所提到的)django_migrations
表以避免重新运行以前的迁移:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
。注意:对于Django 1.8+是否需要执行此步骤,存在一些争论(在注释中)。如果有人知道,请在这里更新。models.py
的的元类已app_name
列出,请确保也将其重命名(由@will提及)。static
或templates
文件夹命名空间,则还需要重命名它们。例如,重命名old_app/static/old_app
为new_app/static/new_app
。models
,您需要更改django_content_type.name
DB中的条目。对于PostgreSQL使用UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
元点(如果使用virtualenv):值得注意的是,如果要重命名包含virtualenv的目录,则env中可能有几个文件包含绝对路径,并且也需要更新。如果您遇到诸如此类的错误,ImportError: No module named ...
可能是罪魁祸首。(感谢@danyamachine提供此功能)。
其他参考:您可能还想参考以下链接以获得更完整的图片
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;
。尽管没有必要,但系统本身并不关心名称。DEFAULT列存储一个OID
('foo_pkey_seq'::regclass
),您可以更改序列的名称而不用破坏它-OID保持不变。
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/zh-CN/1.7/ref/applications/
好玩的问题!我很快将不得不重命名许多应用程序,所以我做了一次试运行。
此方法允许逐步执行进度,以最大程度地减少对正在重命名的应用程序上工作的其他开发人员的干扰。
有关有效的示例代码,请参见此答案底部的链接。
name
和label
为默认值)。INSTALLED_APPS
。db_table
为当前值。db_table
“总是”被明确定义。更改应用标签:
label
在应用程序配置中设置为新的应用程序名称。<app_label>/<model_name>_<suffix>.html
)运行原始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';
确保不需要迁移(请检查上一步)。
db_table
。makemigrations
以便django可以将表重命名为“默认”。name
。INSTALLED_APPS
引用应用程序配置的位置。INSTALLED_APPS
。示例解决方案:我创建了app-rename-example这个示例项目,您可以在其中看到如何重命名应用,一次提交一次。
该示例使用Python 2.7和Django 1.8,但我相信相同的过程至少可以在Python 3.6和Django 2.1上运行。
如果您使用的是PyCharm,并且项目在重命名后停止工作:
重新迁移清洁板的方法。
如果其他应用程序没有要重命名的应用程序中的外键模型,则可以轻松完成此操作。检查并确保其迁移文件未列出此迁移中的任何迁移。
delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
delete from django_content_type where app_label = '<OldAppName>'
views.py
,urls.py
“manage.py”,和settings.py
文件。delete from django_migrations where app = '<OldAppName>'
models.py
的的元类已app_name
列出,请确保也将其重命名(由@will提及)。static
或templates
文件夹命名空间,则还需要重命名它们。例如,重命名old_app/static/old_app
为new_app/static/new_app
。