Как изменить имя приложения 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-и еще!--2--> файлы. - изменить таблицу базы данных
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
tonew_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>'
Meta point (при использовании 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
по умолчанию). - добавить приложение. config для
INSTALLED_APPS
. - на всех моделях явно установить
db_table
к текущему значению. - доктор миграции так что
db_table
"всегда" четко определено. - убедитесь, что миграция не требуется (проверяет предыдущий шаг).
- создать конфигурацию приложения (set
-
изменить ярлык приложения:
- Set
label
в app config в новое приложение имя. - обновление миграций и внешних ключей для ссылки на новую метку приложения.
- обновить шаблоны для общих представлений на основе классов (путь по умолчанию:
<app_label>/<model_name>_<suffix>.html
) -
запустите raw SQL, чтобы исправить миграции и
content_types
app (к сожалению, некоторые необработанные SQL неизбежны).UPDATE django_migrations SET app = 'catalogue' WHERE app = 'shop'; UPDATE django_content_type SET app_label = 'catalogue' WHERE app_label = 'shop';
убедитесь, что миграция не требуется (проверяет предыдущий шаг).
- Set
-
переименовать таблицы:
- удалить "custom"
db_table
. - выполнить
makemigrations
таким образом, django может переименовать таблицу "по умолчанию".
- удалить "custom"
-
переместить файлы:
- переименовать каталог модулей.
- исправление импорта.
- Обновить конфигурацию приложения
name
. - обновить, где
INSTALLED_APPS
ссылки на конфигурации приложения.
-
порядок вверх!--25-->:
- удалите настраиваемую конфигурацию приложения, если она больше не требуется.
- если app config ушел, не забудьте также удалить его из
INSTALLED_APPS
.
пример решения: я создал app-переименовать-пример, пример проекта, где вы можете увидеть, как я переименовал приложение, по одному фиксации за раз.
в примере используется 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-и еще!--4--> файлы. - удалить переносы:
delete from django_migrations where app = '<OldAppName>'
- если
models.py
мета-класс имеетapp_name
в списке, убедитесь, что переименуйте это тоже (упомянуто @will). - если у вас есть пространство имен
static
илиtemplates
папки внутри вашего приложения, вам также необходимо переименовать их. Например, переименоватьold_app/static/old_app
tonew_app/static/new_app
. - если вы определили конфигурацию приложения в apps.py; переименуйте их и переименуйте их ссылки в настройках.INSTALLED_APPS
- удалить файлы миграций.
- повторная миграция и миграция.
- загрузка табличных данных из резервных копий.