J'ai changé le nom d'une application dans Django en renommant son dossier, les importations et toutes ses références (modèles / index). Mais maintenant j'obtiens cette erreur quand j'essaye de courirpython 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?
rename
fonctionnalité vous aidera grandement.Réponses:
Suivez ces étapes pour modifier le nom d'une application dans Django:
views.py
,urls.py
« manage.py » et lessettings.py
fichiers.django_content_type
avec la commande suivante:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
. Pour mysql aussi je pense que c'est la même chose (comme mentionné par @null_radix)django_migrations
table pour éviter d' avoir vos migrations antérieures Réexécutez:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
. Remarque : il y a un débat (dans les commentaires) si cette étape est requise pour Django 1.8+; Si quelqu'un sait avec certitude, veuillez mettre à jour ici.models.py
Meta Class estapp_name
répertorié, assurez-vous de le renommer également (mentionné par @will).static
outemplates
dans votre application, vous devrez également les renommer. Par exemple, renommezold_app/static/old_app
ennew_app/static/new_app
.models
, vous devrez changer l'django_content_type.name
entrée dans DB. Pour une utilisation postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Meta point (si vous utilisez virtualenv): Il convient de noter que si vous renommez le répertoire qui contient votre virtualenv, il y aura probablement plusieurs fichiers dans votre env qui contiennent un chemin absolu et devront également être mis à jour. Si vous rencontrez des erreurs comme celle-ci,
ImportError: No module named ...
cela pourrait être le coupable. (merci à @danyamachine pour cela).Autres références: vous pouvez également consulter les liens ci-dessous pour une image plus complète
la source
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;
. Bien que ce ne soit pas nécessaire, le système lui-même ne se soucie pas du nom. La colonne DEFAULT stocke unOID
('foo_pkey_seq'::regclass
), vous pouvez changer le nom de la séquence sans casser cela - l'OID reste le même.Nouveau dans Django 1.7 est un registre d'applications qui stocke la configuration et fournit une introspection. Cette machine vous permet de modifier plusieurs attributs d'application.
Le point principal que je veux souligner est que renommer une application n'est pas toujours nécessaire: avec la configuration de l'application, il est possible de résoudre les applications en conflit. Mais aussi la voie à suivre si votre application a besoin d'un nom convivial.
À titre d'exemple, je veux nommer mon application de sondage «Commentaires des utilisateurs». Ça va comme ça:
Créez un
apps.py
fichier dans lepolls
répertoire:Ajoutez la configuration d'application par défaut à votre
polls/__init__.py
:Pour plus de configuration d'application: https://docs.djangoproject.com/en/1.7/ref/applications/
la source
Problème amusant! Je vais bientôt devoir renommer beaucoup d'applications, alors j'ai fait un essai.
Cette méthode permet de progresser par étapes atomiques, afin de minimiser les perturbations pour les autres développeurs travaillant sur l'application que vous renommez.
Voir le lien au bas de cette réponse pour un exemple de code fonctionnel.
name
etlabel
par défaut).INSTALLED_APPS
.db_table
la valeur actuelle.db_table
soit «toujours» explicitement défini.Modifiez le libellé de l'application :
label
dans la configuration de l'application sur le nouveau nom de l'application.<app_label>/<model_name>_<suffix>.html
)Exécutez du SQL brut pour corriger les migrations et l'
content_types
application (malheureusement, du SQL brut est inévitable). Vous ne pouvez pas l'exécuter dans une migration.Assurez-vous qu'aucune migration n'est requise (vérifiez l'étape précédente).
db_table
.makemigrations
pour que django puisse renommer la table "par défaut".name
.INSTALLED_APPS
référence à la configuration de l'application.INSTALLED_APPS
.Exemple de solution: j'ai créé app-rename-example , un exemple de projet où vous pouvez voir comment j'ai renommé une application, une validation à la fois.
L'exemple utilise Python 2.7 et Django 1.8, mais je suis convaincu que le même processus fonctionnera au moins sur Python 3.6 et Django 2.1.
la source
Si vous utilisez PyCharm et que le projet cesse de fonctionner après le changement de nom:
la source
Re-migrate approche pour une plaque plus propre.
Cela peut être fait sans douleur SI d'autres applications ne contiennent pas de modèles de clé étrangère de l'application à renommer. Vérifiez et assurez-vous que leurs fichiers de migration ne répertorient aucune migration à partir de celui-ci.
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 » et lessettings.py
fichiers.delete from django_migrations where app = '<OldAppName>'
models.py
Meta Class estapp_name
répertorié, assurez-vous de le renommer également (mentionné par @will).static
outemplates
dans votre application, vous devrez également les renommer. Par exemple, renommezold_app/static/old_app
ennew_app/static/new_app
.la source
Si vous utilisez Pycharm , renommer une application est très simple avec la refactorisation (
Shift
+F6
par défaut) pour tous les fichiers de projet.Mais assurez-vous de supprimer les
__pycache__
dossiers 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): dans
apps.py
de votre application renommée.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 susmentionnée.
la source
Pourquoi ne pas simplement utiliser l'option Rechercher et remplacer. (chaque éditeur de code l'a)?
Par exemple Visual Studio Code (sous l'option Modifier):
Il vous suffit de taper l'ancien nom et le nouveau nom et de remplacer tout ce qui se trouve dans le projet en un seul clic.
REMARQUE : cela renomme uniquement le contenu du fichier, PAS les noms de fichiers et de dossiers. N'oubliez pas de renommer les dossiers, par exemple.
templates/my_app_name/
le renommer entemplates/my_app_new_name/
la source