我已经通过重命名其文件夹,导入及其所有引用(模板/索引)来更改Django中应用程序的名称。但是,当我尝试运行python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
如何调试并解决此错误?有线索吗?
答案 0 :(得分:227)
按照以下步骤更改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
,您需要在DB中更改django_content_type.name
条目。对于postgreSQL使用UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Meta点(如果使用virtualenv):值得注意的是,如果你重命名包含virtualenv的目录,你的env中可能会有几个包含绝对路径的文件,也需要要被更新。如果您收到诸如ImportError: No module named ...
之类的错误,这可能是罪魁祸首。 (感谢@danyamachine提供此功能)。
其他参考:您可能还想参考以下链接以获得更完整的图片
答案 1 :(得分:27)
Django 1.7中的新功能是一个应用程序注册表,用于存储配置并提供内省。这个机器让你改变几个应用程序属性。
我想说的是,重命名应用程序并不总是必要的:使用应用程序配置,可以解决冲突的应用程序。如果你的应用需要友好的命名,那也是你要走的路。
作为一个例子,我想命名我的民意调查应用程序&#39;来自用户的反馈&#39;。它是这样的:
在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/
答案 2 :(得分:8)
如果您使用PyCharm并且项目在重命名后停止工作:
答案 3 :(得分:4)
好玩的问题!我很快将不得不重命名许多应用程序,所以我做了一次试运行。
此方法允许逐步执行进度,以最大程度地减少对正在重命名的应用程序上工作的其他开发人员的干扰。
有关有效的示例代码,请参见此答案底部的链接。
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上运行。
答案 4 :(得分:1)
在许多情况下,我相信@allcaps的answer效果很好。
但是,有时有必要对应用进行重命名,例如提高代码的可读性或防止混淆。
大多数其他答案涉及manual database manipulation或tinkering with existing migrations,我不太喜欢。
作为替代方案,我想用所需的名称创建一个新应用,将所有内容复制过来,确保其可以正常工作,然后删除原始应用:
使用所需名称启动 new 应用,然后将所有代码从原始应用复制到该应用中。确保您在新复制的代码中修复了带名称空间的内容,以使其与新的应用程序名称匹配。
makemigrations
和migrate
创建一个data migration,将相关数据从原始应用程序的表复制到新应用程序的表中,然后再次migrate
。
这时,一切仍然有效,因为原始应用及其数据仍然存在。
现在您可以重构所有相关代码,因此它仅使用新应用程序。有关其他注意事项的示例,请参见其他答案。
确定一切正常后,就可以删除原始应用。
这样做的好处是,每个步骤都使用常规的Django迁移机制,而无需手动进行数据库操作,并且我们可以跟踪源代码控制中的所有内容。此外,我们将原始应用程序及其数据保留在适当的位置,直到我们确定一切正常为止。
答案 5 :(得分:0)
重新迁移更清洁板的方法。
如果其他应用程序不重命名应用程序中的外键模型,则可以轻松完成。检查并确保其迁移文件未列出此迁移文件的任何迁移。
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
。答案 6 :(得分:0)
如果您使用 Pycharm ,则可以对所有项目文件进行重构(默认为mysqldump --add-drop-table -u root --password='xxxxxxxx' nav | sed -e 's/CHARSET\=latin1/CHARSET\=utf8\ COLLATE\=utf8_general_ci/g' | iconv -f latin1 -t utf8 | mysql -u root --password='xxxxxxx' nav
+ Shift
)来重命名应用程序。< br />
但是,请确保删除项目目录及其子目录中的F6
文件夹。也要小心,因为它也会重命名注释,您可以在重构预览窗口中排除它,它会向您显示。
另外,您还必须在已重命名的应用程序的__pycache__
中重命名OldNameConfig(AppConfig):。
如果您不想丢失数据库的数据,则必须像上述答案一样手动对数据库进行查询。
答案 7 :(得分:-5)