220 votes

Comment changer le nom d'une application Django ?

J'ai changé le nom d'une application dans Django en renommant son dossier, ses importations et toutes ses références (templates/index). Mais maintenant j'obtiens cette erreur quand j'essaie d'exécuter python manage.py runserver

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

Comment puis-je déboguer et résoudre cette erreur ? Des indices ?

0 votes

Salut danihp. Oui, je l'ai fait. J'utilise également virtualenv, je ne sais pas si cela a quelque chose à voir.

1 votes

Si, par hasard, vous utilisez PyCharm, son rename vous sera d'une grande aide.

1 votes

Le Sud ne soutient-il pas une telle opération ?

4voto

mehmet Points 3219

Approche de la re-migration pour une assiette plus propre.

Cela peut se faire sans problème si les autres applications ne sont pas des modèles clés étrangers à l'application à renommer. Vérifiez et assurez-vous que leurs fichiers de migration ne répertorient pas de migrations à partir de celle-ci.

  1. Sauvegardez votre base de données. Videz toutes les tables avec a) les données + le schéma pour les éventuelles dépendances circulaires, et b) juste les données pour le rechargement.
  2. Exécutez vos tests.
  3. Vérifiez tout le code dans VCS.
  4. Supprimez les tables de la base de données de l'application à renommer.
  5. Supprimez les autorisations : delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. Supprimer les types de contenu : delete from django_content_type where app_label = '<OldAppName>'
  7. Renommez le dossier de l'application.
  8. Modifiez toutes les références à votre application dans ses dépendances, c'est-à-dire dans le fichier views.py , urls.py , 'manage.py' , et settings.py des fichiers.
  9. Supprimer les migrations : delete from django_migrations where app = '<OldAppName>'
  10. Si votre models.py La classe Meta de l'entreprise a app_name listé, assurez-vous de renommer cela aussi (mentionné par @will).
  11. Si vous avez donné un nom à votre static o templates dans votre application, vous devrez également les renommer. Par exemple, renommez old_app/static/old_app a new_app/static/new_app .
  12. Si vous avez défini des app config dans apps.py ; renommez-les, et renommez leurs références dans settings.INSTALLED_APPS
  13. Supprimer les fichiers de migration.
  14. Refaire des migrations, et migrer.
  15. Chargez les données de vos tables à partir des sauvegardes.

0voto

Subangkar KrS Points 173

Si vous utilisez Pycharm Le renommage d'une application est très facile avec refactoring ( Shift + F6 par défaut) pour tous les fichiers du projet.
Mais assurez-vous de supprimer le __pycache__ dans le répertoire du projet et ses sous-répertoires. Faites également attention car il renomme également les commentaires que vous pouvez exclure dans la fenêtre d'aperçu du refactor qu'il vous montrera.
Et vous devrez renommer OldNameConfig(AppConfig) : en apps.py de votre application renommée en plus.

Si vous ne voulez pas perdre les données de votre base de données, vous devrez le faire manuellement avec une requête dans la base de données comme la réponse mentionnée ci-dessus.

0voto

Prateek Gupta Points 1462

4 étapes simples pour renommer une application existante dans un projet Django sans douleur ni perte de données.

Étape 1

Renommez le dossier de l'application. Pour cet exemple, "old_app" est notre ancien nom et "new_app" est notre nouveau nom".

mv ./old_app ./new_app

Étape 2

Mettez à jour toutes les importations faisant référence à l'ancien dossier pour faire référence au nouveau.

Par exemple :

# Before 
from myproject.old_app import models

# After
from myproject.new_app import models

Étape 3

Mettez à jour les anciennes références de noms d'applications dans le Migrations Django .

Exemples de changements que vous devrez probablement effectuer :

# Before

dependencies = [
    ('old_app', '0023_auto_20200403_1050'),
]

# After

dependencies = [
    ('new_app', '0023_auto_20200403_1050'),
]

# Before

field = models.ForeignKey(
    default=None, on_delete=django.db.models.deletion.CASCADE,
    to='old_app.Experiment'
)

# After

field = models.ForeignKey(
    default=None, on_delete=django.db.models.deletion.CASCADE,
    to='new_app.Experiment'
)

Étape 4

Faites un engagement à ce stade.

Ensuite, quelle que soit la façon dont vous exécutez vos migrations d'applications dans un environnement déployé, exécutez django_rename_app avant d'exécuter vos migrations dans ce processus.

c'est-à-dire avant "python manage.py migrate --noinput", comme le montre l'exemple ci-dessous.

# Before

python manage.py collectstatic --noinput
python manage.py migrate --noinput
gunicorn my_project.wsgi:application

# After

python manage.py collectstatic --noinput
python manage.py rename_app old_app new_app
python manage.py migrate --noinput
gunicorn my_project.wsgi:application

Cela mettra à jour le nom de l'application dans les tables internes suivantes de la base de données Django :

  • django_content_type
  • django_migrations

Et renommez le préfixe de toutes vos tables pour qu'il commence par le nom de votre nouvelle application, plutôt que par l'ancien.

C'est tout.

Note : Il est préférable d'utiliser l'éditeur de texte de votre IDE. trouver et remplacer pour effectuer des modifications dans les différents fichiers.

-5voto

elano7 Points 397

Pourquoi ne pas simplement utiliser l'option Rechercher et remplacer. (chaque éditeur de code en dispose) ?

Par exemple Visual Studio Code (sous l'option Editer) :

Visual Studio Code option: 'Replace in files'

Il vous suffit de taper l'ancien et le nouveau nom et de remplacer tout ce qui se trouve dans le projet en un seul clic.

NOTE : Cela renomme uniquement le contenu des fichiers, PAS les noms de fichiers et de dossiers. N'oubliez pas de renommer les dossiers, par exemple. templates/my_app_name/ le renommer en templates/my_app_new_name/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X