2015-07-23 4 views
5

У меня возникла проблема с импортом приложения в другое приложение в моем проекте django. Я знаю, что на этот вопрос есть вопрос/вопросник, и, поверьте, я прочитал их много, даже некоторые о импорте python.Импорт приложения в проект django

Вот мой проект дерево (я положу настоящее имя папки):

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 

Мой первый был проект (/ дом/пользователь/проект/был) содержит virtualenv создает папки (python3.4) ,

Я проверил на своем пути python sys.path и моей структуре проекта в Pycharm и есть/home/user/project/was.

Когда я делаю это в PyCharm, у меня есть автодополнение работает отлично:

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

Но я получаю ValueError :attempted relative import beyond top-level package when import app

И теперь тот же сценарий, импортируя класс экипажа в художников приложение, но:

from was.crew.models import MyClass 

Autocompletion работает отлично в pycharm, но на этот раз я получил классический ImportError: no name was.crew.

Я нахожу решение сделать это, добавив следующую строку в моем 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 

Обратите внимание, что BASE_DIR уже существует в настройках. И теперь я могу это сделать:

from crew.models import MyClass 

А вот у меня нет ошибки (изменить некоторые параметры в PyCharm иметь AutoCompletion работы).

Это работает, но мне действительно интересно, почему я должен добавить эту строку и почему моя первая попытка не работает.

Я немного потерялся с пакетом, pythonpath и т. Д. (Поэтому я указал в своей схеме все файлы __init__.py).

Не должно from ..anotherapp.models import Class отлично работает без сутенерства в настройках.py?

Независимо от того, следует ли мне сохранять свое решение или это нехорошо?

Заранее благодарим за любой ответ.

PS: обратите внимание, что я уже пытался иметь __init__.py файлов в моей первой и второй папке, без успеха.

ответ

2

Пример проекта (работает).

Структура проекта

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/модели.ру

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

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

В вашем случае как from ..crew.models import MyClass и from crew.models import MyClass должны работать. Я предполагаю, что вы (или PyCharm) пытаетесь запустить некоторый файл или импортировать модуль, когда вы (или PyCharm) находитесь в каталоге приложения. Текущий каталог (что бы это значит) должно быть was (что один созданный django-admin.exe. Надеюсь, что это помогает.

+0

ошибка на самом деле срабатывает, когда я запускаю мой сервер и др перейти на локальный хост:. 8000. И да, он должен работать (на самом деле работает в pycharm, он извлекает мои деревья приложений), но django вызывает ошибку. em с virtualenv python lib, помещенным слишком высоко в дерево папок? – Bestasttung

+0

Какое сообщение об ошибке вы получаете? – f43d65

+0

те я wrotte в моем вопросе. Независимо от того, что я удаляю запись из пути python и выполнение app1.models, похоже, работает без моей строки в настройках. Спасибо за Ваш ответ ! – Bestasttung

2

В Джанго проектах вам не нужно, чтобы дать путь от корня проекта directory.Also base_dir является путь к файлу . проект Джанго это при импорте любого приложения в Django вы просто импортировать его, используя его имя

Так что ваш импорт будет

from crew.models import MyClass 
+0

Да, теперь я удалил запись в пути python (тот, который я принудительно), и он работает. Не знаю, почему, но отлично работает, называя '' 'от crew.models импорт MyClass'''. Спасибо за Ваш ответ. – Bestasttung

+0

@Bestasttung Удовольствие было моим. Он отлично работает из-за BASE_DIR в settings.py вашего проекта django, который отображает путь для приложений django. Оформить заказ этой документации django [link] (https://docs.djangoproject.com/en/1.8/topics/settings/) –

Смежные вопросы