2010-04-11 14 views
18

Sto sviluppando un'applicazione Django, che è un sistema di grandi dimensioni che richiede più sotto-applicazioni per mantenere le cose in ordine. Pertanto, ho una directory di livello superiore che è un'app Django (in quanto ha un file vuoto models.py) e più sottodirectory, che sono anche applicazioni in sé stesse.Sotto-applicazioni Django e struttura del modulo

Il motivo per cui ho implementato la mia applicazione in questo modo è perché le sotto-applicazioni sono separate, ma non verrebbero mai utilizzate da sole, al di fuori dell'applicazione madre. Pertanto non ha senso distribuirli separatamente.

Quando si installa la mia domanda, il file delle impostazioni deve includere qualcosa di simile:

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

... che è ovviamente non ottimale. Questo ha anche il risultato un po 'sgradevole di richiedere che tutte le sotto-applicazioni siano indicate con il loro nome "interno" (ad esempio subapp1, subapp2 ecc.). Ad esempio, se voglio ripristinare le tabelle del database per subapp1, devo digitare:

python manage.py reset subapp1 

Questo è fastidioso, soprattutto perché ho un sub-app chiamato core - che rischia di conflitto con il nome di un'altra applicazione quando la mia applicazione è installata nel progetto di un utente.

Sto facendo questo in modo completamente errato, o è lì per forzare queste app "interne" a cui fare riferimento con il loro nome completo?

+0

Perché questo è il sub-ottimale per te? Potresti chiarire cosa vorresti ottenere? –

+0

Semplicemente perché, per installare la mia "applicazione", è necessaria ogni app all'interno del modulo genitore, quindi è davvero una duplicazione di dati. Inoltre, se aggiungiamo eventuali sotto-applicazioni, devono essere aggiunte all'elenco delle app installate su ogni installazione. –

risposta

12

Lo stai facendo nel modo giusto, dal momento che lo stesso Django lo fa in questo modo. L'app di amministrazione, ad esempio, è registrata in INSTALLED_APPS come django.contrib.admin, ma per ripristinarla è necessario utilizzare manage.py reset admin, e infatti, manage.py reset django.contrib.adminnon funziona.

Potrebbe essere considerato come un bug in Django ...

Tuttavia, non dovrebbe essere interessato da conflitti tra i nomi, perché si dovrebbe sempre eseguire Django all'interno di un ambiente virtualenv, isolata dal resto del installazione python. Questa è una soluzione immensamente più potente e flessibile di eseguire django su una normale installazione python. Ulteriori informazioni, ad esempio, qui: http://mathematism.com/2009/jul/30/presentation-pip-and-virtualenv/

+1

Sto già usando virtualenv, ma questo non risolve il problema - poiché un utente è in realtà molto probabile che crei un'app chiamata 'core' all'interno del loro progetto, che sarebbe quindi in conflitto con la mia app' core'. –

+0

Certo, questa è una limitazione. Ho inviato una patch: http://code.djopoproject.com/attachment/ticket/13323/applabel.diff Vedere anche il ticket corrispondente. Non sono sicuro che il problema sia completamente risolto, comunque. –

+0

Non avevo idea che fosse discusso, grazie. Il biglietto n. 3591 sembra molto promettente, ma non è nella lista per 1.2 quindi suppongo che dovrò solo risolvere il problema fino a quando qualcosa non accadrà. Non ho voglia di eseguire un'installazione personalizzata di Django per questo progetto :). –

Problemi correlati