2015-07-23 16 views
5

Ho riscontrato un problema con un'importazione di un'app in un'altra app nel mio progetto django. So che ci sono diverse domande/domande su questo argomento, e credetemi ne ho letto molte, anche alcune sull'importazione di python.Importazione app nel progetto django

Ecco il mio albero del progetto (mi metterò vero nome cartelle):

was/ # full path from my computer /home/user/project/was 
....was/ #django project created by django-admin startproject 'was' 
    ....manage.py 
    ....artists/ #first app 
     ....migrations/ 
     ....templates/ 
     ....__init__.py 
     ....other_python_files.py 
    ....crew/ #second app  
     ....migrations/ 
     ....templates/ 
     ....__init__.py 
     ....some_files.py 
    ....was/ # folder containing settings.py, main urls.py 
     ....__init__.py 

Il mio primo è stato progetto (/ home/utente/progetto/era) contiene il virtualenv genera cartelle (python3.4) .

Ho controllato il mio percorso Python sys.path e la mia struttura di progetto in Pycharm e c'è/home/user/project/was.

Quando faccio questo PyCharm, ho il completamento automatico che funziona benissimo:

from ..crew.models import MyClass #here i'm in a artists app file 

ma ottengo un ValueError :attempted relative import beyond top-level package when import app

E ora, stesso scenario, l'importazione di una classe equipaggio artisti app, ma:

from was.crew.models import MyClass 

Il completamento automatico funziona bene in pycharm ma questa volta ho ottenuto il classico ImportError: no name was.crew.

trovo una soluzione di farlo con l'aggiunta di questa linea nella mia settings.py:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
sys.path.insert(0, os.path.join(BASE_DIR)) # add this line 

Nota che BASE_DIR già esistono nelle impostazioni. E ora posso fare questo:

from crew.models import MyClass 

E qui ho avuto alcun errore (modificare alcune impostazioni in PyCharm di avere le opere completamento automatico).

Questo funziona, ma mi chiedo davvero perché devo aggiungere questa linea e perché i miei primi due tentativi non funzionano.

Sono un po 'perso con il pacchetto, pythonpath etc (è per questo che ho specificato nello schema tutti i file __init__.py).

Non dovrebbe from ..anotherapp.models import Class funzionare correttamente senza dover rovinare nulla in settings.py?

In ogni caso, dovrei mantenere la mia soluzione o non è una buona cosa?

Grazie in anticipo per qualsiasi risposta.

PS: nota che ho già provato ad avere i file __init__.py nella mia prima e seconda cartella, senza successo.

risposta

2

Progetto di esempio (che funziona).

Struttura del progetto

test_project/ 
    test_project/ 
    settings.py 
    urls.py 
    wsgi.py 
    app1/ 
    models.py 
    app2/ 
    models.py 

App1/models.py

from django.db import models 

class Restaurant(models.Model): 
    name = models.CharField(max_length=255) 

App2/modelli.py

from django.db import models 
from app1.models import Restaurant 

class Waiter(models.Model): 
    restaurant = models.ForeignKey(Restaurant) 
    name = models.CharField(max_length=255) 

Nel tuo caso sia from ..crew.models import MyClass e from crew.models import MyClass dovrebbe funzionare. La mia ipotesi è che tu (o PyCharm) cerchi di eseguire qualche file o modulo di importazione quando tu (o PyCharm) sei nella directory app. Directory corrente (qualsiasi cosa voglia dire) dovrebbe essere was (quello creato da django-admin.exe. Speranza che aiuta.

+0

l'errore in realtà innescano quando lancio il mio server et vado a localhost:. 8000. E sì, dovrebbe funzionare (effettivamente funziona in pycharm, riporta i miei alberi app) ma django genera errori. Potrebbe essere un probl em con lib virtualenv python posto troppo in alto nell'albero delle cartelle? – Bestasttung

+0

Che messaggio di errore ricevi? – f43d65

+0

quelli che ho scritto nella mia domanda. Qualunque cosa rimuova la voce dal percorso python e facendo app1.models sembra funzionare senza la mia linea nelle impostazioni. Grazie per la tua risposta ! – Bestasttung

2

Nei progetti Django non è necessario dare il percorso dalla radice di proiettare directory.Also il BASE_DIR è percorso del . progetto django questo quando si importano qualsiasi applicazione in Django basta importarlo utilizzando il suo nome

Così l'importazione sarà

from crew.models import MyClass 
+0

Sì, ora ho rimosso la voce in path python (quella che ho forzato) e funziona. Non so perché, ma funziona bene scrivendo '' 'da crew.models importando MyClass'''. Grazie per la tua risposta. – Bestasttung

+0

@Bestasttung Il piacere è stato mio. Funziona bene a causa di BASE_DIR nel settings.py del tuo progetto django che mappa il percorso per le app di django. Leggi questa documentazione di django [link] (https://docs.djangoproject.com/en/1.8/topics/settings/) –

Problemi correlati