Как изменить имя приложения Django?

Я изменил имя приложения в Django, переименовав его папку, импорт и все его ссылки (шаблоны/индексы). Но теперь я получаю эту ошибку, когда пытаюсь запустить python manage.py runserver

Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings

Как я могу отладить и решить эту ошибку? Есть зацепки?

5 ответов


выполните следующие действия, чтобы изменить имя приложения в Django:

  1. переименуйте папку, которая находится в корне вашего проекта
  2. измените любые ссылки на ваше приложение в своих зависимостях, т. е. приложение views.py, urls.py, 'manage.py-и еще!--2--> файлы.
  3. изменить таблицу базы данных django_content_type со следующей командой:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. кроме того, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres используйте ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. для MySQL я тоже думаю, что это то же самое (как упоминалось @null_radix)
  5. (для Django >= 1.7) обновление django_migrations таблица, чтобы избежать повторного запуска предыдущих миграций:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Примечание: есть некоторые дебаты (в комментариях) если этот шаг необходим для Django 1.8+; если кто-то знает наверняка, пожалуйста, здесь.
  6. если models.py мета-класс имеет app_name в списке, убедитесь, что переименовать это тоже (упоминается @will).
  7. если у вас есть пространство имен static или templates папки внутри вашего приложения, вам также необходимо переименовать их. Например, переименовать old_app/static/old_app to new_app/static/new_app.
  8. для переименования 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 за предоставление этого).

другие ссылки: вы также можете обратиться к приведенным ниже ссылкам для более полной картины

  1. переименование приложения с Django и South
  2. как перенести модель из одного приложения django в новое?
  3. как изменить название приложения Django?
  4. обратная миграция с Django South
  5. самый простой способ переименовать модель с помощью Django / South?
  6. код (спасибо А. Рауф) для автоматизации вышеуказанных шагов (непроверенный код. Вас предупредили!)
  7. код (спасибо 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 и проект перестает работать после переименования:

  1. изменить конфигурацию запуска / отладки и изменить переменную среды DJANGO_SETTINGS_MODULE, так как она включает имя вашего проекта.
  2. перейдите в раздел Настройки / языки и фреймворки / Django и обновите расположение файла настроек.

проблема, удовольствие! Скоро мне придется переименовать много приложений, поэтому я сделал сухой прогон.

этот метод позволяет добиться прогресса в атомарных шагах, чтобы свести к минимуму нарушения для других разработчиков, работающих над приложением, которое вы переименовываете.

см. ссылку в нижней части этого ответа для пример рабочего кода.

  1. подготовить существующий код для переезда:
    • создать конфигурацию приложения (set name и label по умолчанию).
    • добавить приложение. config для INSTALLED_APPS.
    • на всех моделях явно установить db_table к текущему значению.
    • доктор миграции так что db_table "всегда" четко определено.
    • убедитесь, что миграция не требуется (проверяет предыдущий шаг).
  2. изменить ярлык приложения:

    • 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';
      
    • убедитесь, что миграция не требуется (проверяет предыдущий шаг).

  3. переименовать таблицы:
    • удалить "custom"db_table.
    • выполнить makemigrations таким образом, django может переименовать таблицу "по умолчанию".
  4. переместить файлы:
    • переименовать каталог модулей.
    • исправление импорта.
    • Обновить конфигурацию приложения name.
    • обновить, где INSTALLED_APPS ссылки на конфигурации приложения.
  5. порядок вверх!--25-->:
    • удалите настраиваемую конфигурацию приложения, если она больше не требуется.
    • если app config ушел, не забудьте также удалить его из INSTALLED_APPS.

пример решения: я создал app-переименовать-пример, пример проекта, где вы можете увидеть, как я переименовал приложение, по одному фиксации за раз.

в примере используется Python 2.7 и Django 1.8, но я уверен, что тот же процесс будет работать как минимум на Python 3.6 и Django 2.1.


перенастройка подхода для более чистой пластины.

это можно безболезненно сделать, если другие приложения не внешние модели ключей из приложения, которое будет переименовано. Проверьте и убедитесь, что их файлы миграции не перечисляют никаких миграций из этого.

  1. резервное копирование базы данных. Дамп всех таблиц с a) data + schema для возможных круговых зависимостей и b) просто данные для перезагрузки.
  2. выполнить тесты.
  3. проверьте весь код в VCS.
  4. удалить таблицы базы данных приложения для переименования.
  5. удалить разрешения: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. удалить контент типа: delete from django_content_type where app_label = '<OldAppName>'
  7. переименуйте папку приложения.
  8. измените любые ссылки на ваше приложение в своих зависимостях, т. е. приложение views.py, urls.py, 'manage.py-и еще!--4--> файлы.
  9. удалить переносы: delete from django_migrations where app = '<OldAppName>'
  10. если models.py мета-класс имеет app_name в списке, убедитесь, что переименуйте это тоже (упомянуто @will).
  11. если у вас есть пространство имен static или templates папки внутри вашего приложения, вам также необходимо переименовать их. Например, переименовать old_app/static/old_app to new_app/static/new_app.
  12. если вы определили конфигурацию приложения в apps.py; переименуйте их и переименуйте их ссылки в настройках.INSTALLED_APPS
  13. удалить файлы миграций.
  14. повторная миграция и миграция.
  15. загрузка табличных данных из резервных копий.