Django AppConfig ready() Django AppConfig listo()
Tengo Django 2.1.7.
He leído la documentación de Django, así como esto https://stackoverflow.com/questions/59225246/how-to-use-django-appconfig-ready?noredirect=1&lq=1 y esto https://stackoverflow.com/questions/37429726/overriding-appconfig-ready.
Ahora, la estructura de carpetas/archivos es así,
my_app
__init__.py
urls.py
sub_app1
migrations
__init__.py
admin.py
apps.py
models.py
...
sub_app2
...
sub_app3
...
y todas las sub_app
s se registran en INSTALLED_APPS
del archivo settings.py
de Django como my_app.sub_app1
, por ejemplo. Me di cuenta de que cuando intento sobrescribir ready()
para sub_app1
en sub_app1.apps.py
, la sobrescritura no tiene efecto.
Cuando aplano mi estructura anterior como
my_app
__init__.py
urls.py
apps.py
la sobrescritura de ready
funciona bien.
En otras palabras, parece que la sobrescritura de ready
de una subaplicación dentro del archivo apps.py
de la subaplicación no funciona.
Además, ya sea que use default_app_config
dentro de __init__.py
de la subaplicación o my_app.sub_app1.apps.SubApp1Config
dentro de settings.py INSTALLED_APPS
, da error django.core.exceptions.ImproperlyConfigured: Cannot import 'sub_app1'. Check that 'my_app.sub_app1.apps.SubApp1Config.name' is correct.
¿Por qué está ocurriendo esto?
davy.ai
Parece que el problema con anular el método
ready()
dentro del archivoapps.py
de una subaplicación se debe a la forma en que Django importa e inicializa las aplicaciones. Cuando un proyecto que utiliza Django se inicia, importa todas las aplicaciones que se enumeran ensettings.py
e las inicializa. Este proceso de inicialización pasa por la subclaseAppConfig
de cada aplicación, que es responsable de tareas como inicializar señales y conectarse a la base de datos.Cuando una subaplicación se lista como
my_app.sub_app1
enINSTALLED_APPS
, Django espera encontrar su subclaseAppConfig
enmy_app.sub_app1.apps
. Sin embargo, si el archivoapps.py
se encuentra en el directorio de la subaplicación (my_app.sub_app1
), no será encontrado por el mecanismo de importación. En su lugar, se utilizará la subclaseAppConfig
definida enmy_app.apps
(elapps.py
de nivel de proyecto), que no tiene la anulación deready()
definida parasub_app1
.Para solucionar este problema, una solución es mover el archivo
apps.py
al directorio de la aplicación principal (my_app
). De esta manera, la subclaseAppConfig
definida enmy_app.sub_app1.apps
será encontrada y utilizada durante la inicialización, lo que permitirá que la anulación deready()
surta efecto.El error con
default_app_config
ymy_app.sub_app1.apps.SubApp1Config
que no se reconocen como opciones de configuración válidas ensettings.py
probablemente también esté relacionado con el problema mencionado anteriormente. Si la subclaseAppConfig
de una subaplicación no se encuentra durante la inicialización, cualquier intento de hacer referencia a ella en otro lugar (como condefault_app_config
o la cadena de importación completa enINSTALLED_APPS
) fallará.