Cambié el nombre de una aplicación en Django al renombrar su carpeta, importaciones y todas sus referencias (plantillas / índices). Pero ahora recibo este error cuando intento ejecutarpython manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
¿Cómo puedo depurar y resolver este error? ¿Alguna pista?
rename
función lo ayudará mucho con esto.Respuestas:
Siga estos pasos para cambiar el nombre de una aplicación en Django:
views.py
,urls.py
'manage.py', ysettings.py
archivos.django_content_type
con el siguiente comando:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
. Para mysql también creo que es lo mismo (como lo menciona @null_radix)django_migrations
tabla para evitar que sus migraciones anteriores volver a ejecutar:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'
. Nota : hay algún debate (en los comentarios) si este paso es necesario para Django 1.8+; Si alguien lo sabe con seguridad, actualice aquí.models.py
Meta Class haapp_name
aparecido, asegúrese de cambiarle el nombre también (mencionado por @will).static
otemplates
carpetas dentro de su aplicación, también tendrá que cambiar el nombre de las personas. Por ejemplo, cambie el nombreold_app/static/old_app
anew_app/static/new_app
.models
, deberá cambiar ladjango_content_type.name
entrada en DB. Para uso postgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Metapunto (si usa virtualenv): Vale la pena señalar, si está cambiando el nombre del directorio que contiene su virtualenv, es probable que haya varios archivos en su env que contengan una ruta absoluta y también deberán actualizarse. Si recibe errores como
ImportError: No module named ...
este, podría ser el culpable. (Gracias a @danyamachine por proporcionar esto).Otras referencias: también puede consultar los enlaces a continuación para obtener una imagen más completa
fuente
ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;
. Aunque no es necesario, al sistema en sí no le importa el nombre. La columna DEFAULT almacena unOID
('foo_pkey_seq'::regclass
), puede cambiar el nombre de la secuencia sin romper eso: el OID permanece igual.Nuevo en Django 1.7 es un registro de aplicaciones que almacena la configuración y proporciona introspección. Esta maquinaria le permite cambiar varios atributos de la aplicación.
El punto principal que quiero destacar es que cambiar el nombre de una aplicación no siempre es necesario: con la configuración de la aplicación es posible resolver aplicaciones conflictivas. Pero también el camino a seguir si su aplicación necesita nombres amigables.
Como ejemplo, quiero nombrar mi aplicación de encuestas 'Comentarios de los usuarios'. Dice así:
Cree un
apps.py
archivo en elpolls
directorio:Agregue la configuración de la aplicación predeterminada a su
polls/__init__.py
:Para obtener más configuración de la aplicación: https://docs.djangoproject.com/en/1.7/ref/applications/
fuente
Problema divertido! Tendré que cambiar el nombre de muchas aplicaciones pronto, así que hice una prueba en seco.
Este método permite avanzar en pasos atómicos, para minimizar la interrupción para otros desarrolladores que trabajan en la aplicación que está renombrando.
Vea el enlace al final de esta respuesta para ver el código de ejemplo de trabajo.
name
ylabel
predeterminada).INSTALLED_APPS
.db_table
el valor actual.db_table
"siempre" se definió explícitamente.Cambiar la etiqueta de la aplicación :
label
en la configuración de la aplicación con el nuevo nombre de la aplicación.<app_label>/<model_name>_<suffix>.html
)Ejecute SQL sin formato para corregir las migraciones y la
content_types
aplicación (desafortunadamente, algunos SQL sin formato son inevitables). No puede ejecutar esto en una migración.Asegúrese de que no se requieran migraciones (verifica el paso anterior).
db_table
.makemigrations
para que django pueda cambiar el nombre de la tabla "por defecto".name
.INSTALLED_APPS
referencia a la configuración de la aplicación.INSTALLED_APPS
.Solución de ejemplo: he creado app-rename-example , un proyecto de ejemplo donde puedes ver cómo cambié el nombre de una aplicación, una confirmación a la vez.
El ejemplo usa Python 2.7 y Django 1.8, pero estoy seguro de que el mismo proceso funcionará al menos en Python 3.6 y Django 2.1.
fuente
En caso de que esté usando PyCharm y el proyecto deje de funcionar después de cambiar el nombre:
fuente
Enfoque de re-migración para una placa más limpia.
Esto se puede hacer sin problemas SI otras aplicaciones no modifican los modelos de clave externa de la aplicación para cambiarle el nombre. Verifique y asegúrese de que sus archivos de migración no incluyan ninguna migración de este.
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', ysettings.py
archivos.delete from django_migrations where app = '<OldAppName>'
models.py
Meta Class haapp_name
aparecido, asegúrese de cambiarle el nombre también (mencionado por @will).static
otemplates
carpetas dentro de su aplicación, también tendrá que cambiar el nombre de las personas. Por ejemplo, cambie el nombreold_app/static/old_app
anew_app/static/new_app
.fuente
Si usa Pycharm , cambiar el nombre de una aplicación es muy fácil con la refactorización (
Shift
+F6
predeterminado) para todos los archivos de proyecto.Pero asegúrese de eliminar las
__pycache__
carpetas en el directorio del proyecto y sus subdirectorios. También tenga cuidado, ya que también cambia el nombre de los comentarios que puede excluir en la ventana de vista previa del refactor que le mostrará.Y deberá cambiar el nombre de OldNameConfig (AppConfig): además
apps.py
de su aplicación renombrada.Si no desea perder datos de su base de datos, deberá hacerlo manualmente con una consulta en la base de datos como la respuesta mencionada anteriormente.
fuente
¿Por qué no usar la opción Buscar y reemplazar? (cada editor de código lo tiene)?
Por ejemplo, Visual Studio Code (en la opción Editar):
Simplemente escriba el nombre antiguo y el nuevo nombre y reemplace todo en el proyecto con un solo clic.
NOTA : Esto renombra solo el contenido del archivo, NO los nombres de archivos y carpetas. No olvide cambiar el nombre de las carpetas, por ejemplo.
templates/my_app_name/
renombrarlo atemplates/my_app_new_name/
fuente