Как изменить имя приложения Django?
Я изменил имя приложения в Django, переименовав его папку, импорт и все его ссылки (шаблоны/индексы). Но теперь я получаю эту ошибку, когда я пытаюсь запустить python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Как я могу отладить и решить эту ошибку? Какие-нибудь улики?
5 ответов:
выполните следующие действия, чтобы изменить имя приложения в Django:
- переименуйте папку, которая находится в корне вашего проекта
- измените любые ссылки на ваше приложение в своих зависимостях, т. е. приложение
views.py,urls.py, 'manage.py - и ещеsettings.pyфайлы.- Редактировать таблицу базы данных
django_content_typeС помощью следующей команды:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'- кроме того, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres используйте
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. для MySQL тоже я думаю, что это то же самое (как упоминалось @null_radix)- (для Django >= 1.7) обновление
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.- для переименования django
models, вам нужно будет изменитьdjango_content_type.nameзапись в БД. Для postgreSQL используйтеUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'мета-точка (при использовании virtualenv): стоит отметить, что если вы переименовываете каталог, содержащий ваш virtualenv, в вашем env, скорее всего, будет несколько файлов, которые содержат абсолютный путь и будут также должны быть обновлены. Если вы получаете ошибки, такие как
ImportError: No module named ...это может быть виновником. (спасибо @danyamachine за предоставление этого).другие ссылки: вы также можете обратиться к приведенным ниже ссылкам для более полной картины
- переименование приложения с Django и South
- как перенести модель из одного приложения django в новое?
- как изменить название приложения Django?
- обратная миграция с Django South
- самый простой способ переименовать модель с помощью Django / South?
- код (спасибо А. Рауф) для автоматизации вышеуказанных шагов (непроверенный код. Вы были предупреждены!)
- код (спасибо rafaponieman) для автоматизации вышеуказанных шагов (непроверенный код. Ты был ... предупрежден!)
New in Django 1.7-это реестр приложений, который хранит конфигурацию и обеспечивает самоанализ. Этот механизм позволяет вам изменить несколько атрибутов приложения.
главное, что я хочу сделать, это то, что переименование приложения не всегда необходимо: с конфигурацией приложения можно разрешить конфликтующие приложения. Но также и путь, если ваше приложение нуждается в дружественном именовании.
в качестве примера я хочу назвать свое приложение для опросов "обратная связь от пользователей". Это звучит так: это:
создать на :
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 и обновите расположение файла настроек.
проблема, удовольствие! Мне скоро придется переименовать много приложений, поэтому я сделал сухой прогон.
этот метод позволяет добиться прогресса в атомарных шагах, чтобы свести к минимуму нарушения для других разработчиков, работающих над приложением, которое вы переименовываете.
см. ссылку в нижней части этого ответа для пример рабочего кода.
- подготовить существующий код для переезда:
- создать конфигурацию приложения (set
nameиlabelпо умолчанию).- добавьте конфигурацию приложения в
INSTALLED_APPS.- на всех моделях, заданы явно
db_tableк текущему значению.- доктор мигрирует так что
db_table"всегда" четко определено.- убедитесь, что миграция не требуется (проверяет предыдущий шаг).
изменить ярлык приложения:
- Set
labelв app config в новое приложение имя.- обновление миграций и внешних ключей для ссылки на новую метку приложения.
- обновить шаблоны для общих представлений на основе классов (путь по умолчанию:
<app_label>/<model_name>_<suffix>.html)запустите raw 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ссылки на конфигурации приложения.- порядок вверх:
- удалите пользовательскую конфигурацию приложения, если она больше не требуется.
- если приложение config ушел, не забудьте также удалить его из
INSTALLED_APPS.
пример решения: я создал приложения-переименовать-пример, пример проекта, где вы можете увидеть, как я переименовал приложение, по одному фиксации за раз.
в примере используется Python 2.7 и Django 1.8, но я уверен, что тот же процесс будет работать как минимум на Python 3.6 и Django 2.1.
повторно мигрируйте подход для более чистой пластины.
это может быть сделано безболезненно, если другие приложения не внешние ключевые модели из приложения, которое будет переименовано. Проверьте и убедитесь, что их файлы миграции не содержат никаких миграций из этого.
- резервное копирование базы данных. Дамп всех таблиц с A) DATA + schema для возможных циклических зависимостей и b) просто данные для перезагрузки.
- выполнить тесты.
- проверьте весь код в VCS.
- удалите таблицы базы данных приложения, которое будет переименовано.
- удалить разрешения:
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.- если вы определили конфигурацию приложения в apps.py; переименуйте их и переименуйте их ссылки в настройках.INSTALLED_APPS
- удалить файлы миграций.
- повторно совершают миграции, а миграция.
- загрузка табличных данных из резервных копий.
Comments