2015-07-23 16 views
5

Miałem problem z importem aplikacji w innej aplikacji w moim projekcie django. Wiem, że są różne pytania/asnwsers na ten temat, i wierz mi, czytam wiele z nich, nawet niektóre o import Pythona.Importowanie aplikacji w projekcie django

Oto mój projekt drzewo (będę umieścić prawdziwe nazwisko katalogów):

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 

Mój pierwszy był projekt (/ home/user/project/było) zawiera virtualenv generuje foldery (python3.4) .

Sprawdziłem na mojej ścieżce pythonowej sys.path i mojej strukturze projektu w Pycharmie i tam jest/home/user/project/was.

Kiedy to zrobić w pycharm, mam autocompletion działa poprawnie:

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

Ale otrzymuję ValueError :attempted relative import beyond top-level package when import app

a teraz sam scenariusz, importowanie klasy załogi artystów aplikacji ale:

from was.crew.models import MyClass 

Autouzupełnianie działa dobrze w pycharmie, ale tym razem dostałem klasyczny ImportError: no name was.crew.

znajdę rozwiązanie robi to poprzez dodanie tej linii w moim 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 

Zauważ, że BASE_DIR już istnieją w ustawieniach. A teraz mogę to zrobić:

from crew.models import MyClass 

I tu nie mam błąd (zmienić niektóre ustawienia w pycharm mieć prace autouzupełnianie).

To działa, ale naprawdę zastanawiam się, dlaczego muszę dodać tę linię i dlaczego moje dwie pierwsze próby nie działają.

Jestem trochę zagubiony w pakiecie, pythonpath itp. (To dlatego określiłem w moim schemacie wszystkie pliki __init__.py).

Czy nie powinno być from ..anotherapp.models import Class działa dobrze, nie pakując niczego w settings.py?

Niezależnie od tego, czy powinienem zachować swoje rozwiązanie, czy nie jest to dobre?

Z góry dziękuję za każdą odpowiedź.

PS: zauważ, że już próbowałem mieć pliki __init__.py w moim pierwszym i drugim folderze, bez powodzenia.

Odpowiedz

2

Przykładowy projekt (który działa).

Struktura projektu

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/modele.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) 

W twoim przypadku zarówno from ..crew.models import MyClass i from crew.models import MyClass powinno działać. Domyślam się, że ty (lub PyCharm) próbujesz uruchomić jakiś plik lub moduł importu, kiedy (lub PyCharm) jesteś w katalogu aplikacji. Bieżący katalog (cokolwiek to znaczy) powinien być was (ten utworzony przez django-admin.exe. Mam nadzieję, że to pomoże

+0

błąd rzeczywiście wywołać kiedy uruchomić mój serwer i przejść do localhost. 8000. I tak to powinno działać (w rzeczywistości działa w pycharmie, przechwytuje moje drzewa aplikacji), ale django podnosi błąd. Czy to może być probl em z virtualenv python lib umieszczone zbyt wysoko w drzewie folderów? – Bestasttung

+0

Jaki komunikat o błędzie dostałeś? – f43d65

+0

te, które wrotte w moim pytaniu. Cokolwiek usunąć wpis z ścieżki Pythona i robi app1.models wydaje się działać bez mojego wiersza w ustawieniach. Dzięki za odpowiedź ! – Bestasttung

2

W projektach django nie trzeba podawać ścieżki z katalogu głównego do katalogu projektu. Również ścieżka_BAZA_CHEŃ jest ścieżką do twojego . projekt Django to podczas importowania dowolną aplikację w Django po prostu importować go przy użyciu jego nazwy

Więc import będzie

from crew.models import MyClass 
+0

Tak, teraz usunąłem wpis ze ścieżki pythona (tej, którą wymusiłem) i działa. Nie wiem dlaczego, ale działa dobrze, pisząc '' 'from crew.models import MyClass''''. Dzięki za odpowiedź. – Bestasttung

+0

@Bestasttung Przyjemność była moja. Działa dobrze z powodu BASE_DIR w settings.py twojego projektu django, który odwzorowuje ścieżkę dla aplikacji django. Zapoznaj się z tą dokumentacją django [link] (https://docs.djangoproject.com/en/1.8/topics/settings/) –

Powiązane problemy