Ich habe den Namen einer App in Django geändert, indem ich ihren Ordner, Importe und alle ihre Referenzen (Vorlagen / Indizes) umbenannt habe. Aber jetzt bekomme ich diesen Fehler, wenn ich versuche zu laufenpython manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Wie kann ich diesen Fehler debuggen und beheben? Irgendwelche Hinweise?
rename
hilft Ihnen die Funktion dabei sehr.Antworten:
Führen Sie die folgenden Schritte aus, um den Namen einer App in Django zu ändern:
views.py
,urls.py
‚manage.py‘ undsettings.py
Dateien.django_content_type
mit dem folgenden Befehl:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
. Auch für MySQL denke ich, dass es dasselbe ist (wie von @null_radix erwähnt)django_migrations
Tabelle, um zu vermeiden, dass Ihre vorherigen Migrationen erneut ausgeführt werden :UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
. Hinweis : Es gibt einige Debatten (in Kommentaren), ob dieser Schritt für Django 1.8+ erforderlich ist. Wenn jemand sicher weiß, bitte hier aktualisieren.models.py
Meta-Klasse Ihresapp_name
Benutzers aufgeführt ist, benennen Sie diese ebenfalls um (von @will erwähnt).static
odertemplates
Ordner in Ihrer App mit einem Namespace versehen haben , müssen Sie diese auch umbenennen. Benennen Sie beispielsweiseold_app/static/old_app
annew_app/static/new_app
.models
, müssen Sie dendjango_content_type.name
Eintrag in der Datenbank ändern . Für postgreSQL verwendenUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Metapunkt (bei Verwendung von virtualenv): Wenn Sie das Verzeichnis umbenennen, in dem sich virtualenv befindet, befinden sich wahrscheinlich mehrere Dateien in Ihrer Umgebung, die einen absoluten Pfad enthalten und ebenfalls aktualisiert werden müssen. Wenn Sie Fehler wie
ImportError: No module named ...
diese erhalten, könnte dies der Schuldige sein. (Danke an @danyamachine für die Bereitstellung).Andere Referenzen: Möglicherweise möchten Sie auch auf die folgenden Links verweisen, um ein vollständigeres Bild zu erhalten
quelle
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;
. Obwohl dies nicht erforderlich ist, kümmert sich das System selbst nicht um den Namen. In der Spalte DEFAULT wird einOID
('foo_pkey_seq'::regclass
) gespeichert. Sie können den Namen der Sequenz ändern, ohne dies zu unterbrechen - die OID bleibt gleich.Neu in Django 1.7 ist eine App-Registrierung, die die Konfiguration speichert und Introspektion bietet. Mit dieser Maschine können Sie mehrere App-Attribute ändern.
Der wichtigste Punkt, den ich ansprechen möchte, ist, dass das Umbenennen einer App nicht immer erforderlich ist: Mit der App-Konfiguration ist es möglich, widersprüchliche Apps zu lösen. Aber auch der richtige Weg, wenn Ihre App eine freundliche Benennung benötigt.
Als Beispiel möchte ich meine Umfrage-App "Feedback von Benutzern" nennen. Es geht so:
Erstellen Sie eine
apps.py
Datei impolls
Verzeichnis:Fügen Sie die Standard-App-Konfiguration zu
polls/__init__.py
:Weitere App-Konfiguration: https://docs.djangoproject.com/de/1.7/ref/applications/
quelle
Lustiges Problem! Ich werde bald viele Apps umbenennen müssen, also habe ich einen Probelauf gemacht.
Mit dieser Methode können Fortschritte in atomaren Schritten erzielt werden, um Störungen für andere Entwickler zu minimieren, die an der App arbeiten, die Sie umbenennen.
Unter dem Link unten in dieser Antwort finden Sie einen funktionierenden Beispielcode.
name
undlabel
auf Standardeinstellungen setzen).INSTALLED_APPS
.db_table
den aktuellen Wert ein.db_table
"immer" explizit definiert wurde.Ändern Sie die App-Bezeichnung :
label
App-Konfiguration auf neuen App-Namen setzen.<app_label>/<model_name>_<suffix>.html
)Führen Sie Raw SQL aus, um Migrationen und Apps zu korrigieren
content_types
(leider ist einige Raw SQL unvermeidbar). Sie können dies nicht in einer Migration ausführen.Stellen Sie sicher, dass keine Migrationen erforderlich sind (überprüft den vorherigen Schritt).
db_table
.makemigrations
damit django die Tabelle "auf die Standardeinstellung" umbenennen kann.name
.INSTALLED_APPS
auf die App-Konfiguration verwiesen wird.INSTALLED_APPS
.Beispiellösung: Ich habe ein App-Rename-Beispiel erstellt , ein Beispielprojekt, in dem Sie sehen können, wie ich eine App nacheinander umbenannt habe.
Das Beispiel verwendet Python 2.7 und Django 1.8, aber ich bin zuversichtlich, dass der gleiche Prozess mindestens für Python 3.6 und Django 2.1 funktioniert.
quelle
Wenn Sie PyCharm verwenden und das Projekt nach dem Umbenennen nicht mehr funktioniert:
quelle
Re-Migrate-Ansatz für eine sauberere Platte.
Dies ist problemlos möglich, wenn andere Apps keine Fremdschlüsselmodelle aus der umzubenennenden App verwenden. Überprüfen Sie, ob in den Migrationsdateien keine Migrationen von dieser Datei aufgeführt sind.
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‘ undsettings.py
Dateien.delete from django_migrations where app = '<OldAppName>'
models.py
Meta-Klasse Ihresapp_name
Benutzers aufgeführt ist, benennen Sie diese ebenfalls um (von @will erwähnt).static
odertemplates
Ordner in Ihrer App mit einem Namespace versehen haben , müssen Sie diese auch umbenennen. Benennen Sie beispielsweiseold_app/static/old_app
annew_app/static/new_app
.quelle
Wenn Sie Pycharm verwenden , ist das Umbenennen einer App mit Refactoring (
Shift
+F6
Standard) für alle Projektdateien sehr einfach .Stellen Sie jedoch sicher, dass Sie die
__pycache__
Ordner im Projektverzeichnis und seinen Unterverzeichnissen löschen . Seien Sie auch vorsichtig, da auch Kommentare umbenannt werden, die Sie im angezeigten Refactor-Vorschaufenster ausschließen können.Und Sie müssen OldNameConfig (AppConfig): in
apps.py
Ihrer umbenannten App zusätzlich umbenennen .Wenn Sie keine Daten Ihrer Datenbank verlieren möchten, müssen Sie dies manuell mit einer Abfrage in der Datenbank wie der oben genannten Antwort tun.
quelle
Verwenden Sie einfach die Option Suchen und Ersetzen. (Jeder Code-Editor hat es)?
Zum Beispiel Visual Studio Code (unter Bearbeiten):
Sie geben einfach den alten und den neuen Namen ein und ersetzen alles im Projekt mit einem Klick.
HINWEIS : Hiermit werden nur Dateiinhalte umbenannt, NICHT Datei- und Ordnernamen. Vergessen Sie nicht, Ordner umzubenennen, z.
templates/my_app_name/
benenne es um intemplates/my_app_new_name/
quelle