2010-04-11 14 views
18

Estoy desarrollando una aplicación Django, que es un sistema grande que requiere múltiples sub-aplicaciones para mantener las cosas ordenadas. Por lo tanto, tengo un directorio de nivel superior que es una aplicación Django (ya que tiene un archivo models.py vacío) y múltiples subdirectorios, que también son aplicaciones en sí mismos.Sub-aplicaciones Django y estructura de módulo

La razón por la que he presentado mi aplicación de esta manera es porque las sub-aplicaciones están separadas, pero nunca se usarán por sí mismas, fuera de la aplicación principal. Por lo tanto, no tiene sentido distribuirlos por separado.

Al instalar mi aplicación, el archivo de configuración tiene que incluir algo como esto:

INSTALLED_APPS = (
    ... 
    'myapp', 
    'myapp.subapp1', 
    'myapp.subapp2', 
    ... 
) 

... que obviamente es subóptima. Esto también tiene el resultado ligeramente desagradable de requerir que todas las sub-aplicaciones se mencionen por su nombre "interno" (es decir, subapp1, subapp2 etc.). Por ejemplo, si quiero restablecer las tablas de la base de subapp1, tengo que escribir:

python manage.py reset subapp1 

Esto es molesto, sobre todo porque tengo una sub-aplicación llamada core - que es probable que el conflicto con el nombre de otra aplicación cuando mi aplicación está instalada en un proyecto de usuario.

¿Estoy haciendo esto completamente erróneamente, o está ahí para forzar que estas aplicaciones "internas" se mencionen por su nombre completo?

+0

¿Por qué no es óptimo para usted? ¿Podría aclarar lo que le gustaría lograr? –

+0

Simplemente porque, para instalar mi "aplicación", se requiere cada aplicación dentro del módulo principal, por lo que realmente es una duplicación de datos. Además, si alguna vez agregamos alguna sub-aplicación, deben agregarse a la lista de aplicaciones instaladas en cada instalación. –

Respuesta

12

Lo estás haciendo de la manera correcta, ya que django lo hace de esa manera. La aplicación de administración, por ejemplo, está registrada en INSTALLED_APPS como django.contrib.admin, pero para restablecerla debe usar manage.py reset admin, y de hecho, manage.py reset django.contrib.adminno funciona.

Se podría considerar como un error en Django ...

Sin embargo, usted no debe preocuparse por conflictos de nombre, porque siempre se debe ejecutar Django dentro de un entorno virtualenv, aislados del resto de la instalación de python Esta es una solución inmensamente más poderosa y flexible que ejecutar django en una instalación ordinaria de python. Más información, por ejemplo, aquí: http://mathematism.com/2009/jul/30/presentation-pip-and-virtualenv/

+1

Ya estoy usando virtualenv, pero esto no soluciona el problema, ya que un usuario es bastante probable que haga una aplicación llamada 'core' dentro de su proyecto, lo que entraría en conflicto con mi aplicación' core'. –

+0

Claro, esto es una limitación. Envié un parche: http://code.djangoproject.com/attachment/ticket/13323/applabel.diff Consulte también el ticket correspondiente. Aunque no estoy seguro si el problema está completamente resuelto. –

+0

No tenía idea de que esto estaba siendo discutido, gracias. El boleto # 3591 se ve muy prometedor, pero no está en la lista para el 1.2, así que supongo que tendré que solucionar el problema hasta que ocurra algo. No me gusta ejecutar una instalación personalizada de Django para este proyecto :). –

Cuestiones relacionadas