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



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



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


Как я могу отладить и решить эту ошибку? Какие-нибудь улики?

1245   5  

5 ответов:

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

  1. переименуйте папку, которая находится в корне вашего проекта
  2. измените любые ссылки на ваше приложение в своих зависимостях, т. е. приложение views.py,urls.py, 'manage.py - и еще settings.py файлы.
  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 до 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>'

мета-точка (при использовании 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 по умолчанию).
    • добавьте конфигурацию приложения в INSTALLED_APPS.
    • на всех моделях, заданы явно db_table к текущему значению.
    • доктор мигрирует так что db_table "всегда" четко определено.
    • убедитесь, что миграция не требуется (проверяет предыдущий шаг).
  2. изменить ярлык приложения:

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

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

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

в примере используется 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 - и еще settings.py файлы.
  9. удалить переносы: delete from django_migrations where app = '<OldAppName>'
  10. если models.py мета класс имеет app_name в списке, убедитесь, что переименуйте это тоже (упоминается @will).
  11. если у вас есть пространство имен static или templates папки внутри вашего приложения, вы также должны переименовать их. Например, переименовать old_app/static/old_app до new_app/static/new_app.
  12. если вы определили конфигурацию приложения в apps.py; переименуйте их и переименуйте их ссылки в настройках.INSTALLED_APPS
  13. удалить файлы миграций.
  14. повторно совершают миграции, а миграция.
  15. загрузка табличных данных из резервных копий.

Comments

    Ничего не найдено.