Я изменил название приложения в Django, переименовав его папку, импортировав все ссылки (шаблоны / индексы). Но теперь я получаю эту ошибку при попытке запуститьpython manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Как я могу отладить и устранить эту ошибку? Есть какие-нибудь подсказки?
rename
функция очень поможет вам в этом.Ответы:
Выполните следующие действия, чтобы изменить имя приложения в 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
Meta Class есть вapp_name
списке, обязательно переименуйте его тоже (упомянуто @will).static
илиtemplates
папках внутри приложения, вам также необходимо их переименовать. Например, переименуйтеold_app/static/old_app
вnew_app/static/new_app
.models
вам нужно изменитьdjango_content_type.name
запись в БД. Для использования PostgreSQLUPDATE 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
каталоге:Добавьте конфигурацию приложения по умолчанию к вашему
polls/__init__.py
:Для дополнительной конфигурации приложения: https://docs.djangoproject.com/en/1.7/ref/applications/
источник
Забавная проблема! Мне скоро придется переименовать много приложений, поэтому я пробовал.
Этот метод позволяет продвигаться в элементарных шагах, чтобы минимизировать сбои для других разработчиков, работающих над приложением, которое вы переименовываете.
Смотрите ссылку внизу этого ответа для рабочего примера кода.
name
иlabel
по умолчанию).INSTALLED_APPS
.db_table
текущее значение.db_table
было «всегда» четко определено.Изменить ярлык приложения :
label
в настройках приложения новое имя приложения.<app_label>/<model_name>_<suffix>.html
по умолчанию - )Запустите сырой SQL, чтобы исправить миграции и
content_types
приложения (к сожалению, некоторый сырой SQL неизбежен). Вы не можете запустить это в миграции.Убедитесь, что миграция не требуется (проверяет предыдущий шаг).
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
Meta Class есть вapp_name
списке, обязательно переименуйте его тоже (упомянуто @will).static
илиtemplates
папках внутри приложения, вам также необходимо их переименовать. Например, переименуйтеold_app/static/old_app
вnew_app/static/new_app
.источник
Если вы используете Pycharm , переименование приложения очень просто с рефакторингом (
Shift
+ поF6
умолчанию) для всех файлов проекта.Но обязательно удалите
__pycache__
папки в каталоге проекта и его подкаталогах. Также будьте осторожны, так как он также переименовывает комментарии, которые вы можете исключить в окне предварительного просмотра рефактора.И вам придется переименовать OldNameConfig (AppConfig): в
apps.py
вашем переименованном приложении в дополнение.Если вы не хотите терять данные своей базы данных, вам придется вручную сделать это с запросом в базе данных, как вышеупомянутый ответ.
источник
Почему бы просто не использовать опцию «Найти и заменить». (у каждого редактора кода есть)?
Например, код Visual Studio (в разделе «Изменить»):
Вы просто вводите старое имя и новое имя и заменяете все в проекте одним щелчком мыши.
ПРИМЕЧАНИЕ . Это переименовывает только содержимое файла, а НЕ имена файлов и папок. Не забудьте переименовать папки, например.
templates/my_app_name/
переименуйте его вtemplates/my_app_new_name/
источник