Я с самого начала пытаюсь получить наилучшие настройки для разработки моего проекта django, и у меня возникают проблемы с тем, чтобы все нормально работало в структуре каталогов. Я настроил virtualenv (в данном примере env), чтобы я мог развернуть чистую пустую среду Python для каждого проекта django.
Основная структура выглядит следующим образом:
/env/
/bin
/db <--- Django DB
/downloads
/lib
/static <--- Where css/imgs/js etc is served from
/project/ <--- Django root
/__init__.py
/settings.py
/manage.py
/appsfolder/
/appname/
/__init__.py
/models/
/__init__.py
/somemodel.py
/urls/
/__init__.py
/someurl.py
/views/
/__init__.py
/someview.py
Это базовая структура; Я хочу, чтобы в каждом проекте был каталог для приложений, и в каждом приложении была отдельная папка для моделей, просмотра и URL-адресов.
Проблема, с которой я столкнулся, связана с путем Python и с тем, как обрабатываются модули.
В приложении я не хочу ссылаться на проект при импорте моделей, т.е. я должен использовать:
import appname.models.modelname
not:
import projectname.models.modelname
, чтобы облегчить повторное использование
В каталоге моделей у меня есть после init .py
from model1 import ModelName1
from model2 import ModelName2
from model3 import ModelName3
__all__ = ['ModelName1', 'ModelName2', 'ModelName3']
Но когда я пытаюсь использовать отдельный файл url (в /appname/urls/urlfile.py) и импортирую модели, подобные следующим:
from appname.models.somemodel import ModelName
Я получаю "модуль" не найдена "ошибка.
while:
from appsfolder.appname.models.somemodel import ModelName
работает нормально
Я полагаю, это связано с тем, что приложение не находится непосредственно на пути python, вместо этого оно находится в подпапке под названием appsfolder, но я не знаю, как это исправить, сохраняя при этом все пригодное для повторного использования и относительное.
Я знаю, что одним из решений является размещение всех приложений прямо по пути python в пакетах сайтов, но мне эта идея не очень нравится, поскольку я думаю, что приложения должны быть в проекте, если вы используете virtualenv