"ImportError: нет модуля с именем jobs.models" с относительным путем
django 1.4,python 2.6.6.
У меня есть приложение "Работа".
дерево моих файлов:
djproject/
|-- djproject
| |-- db
| | `-- tdata.db
| |-- __init__.py
| |-- __init__.pyc
| |-- jobs
| | |-- admin.py
| | |-- admin.pyc
| | |-- __init__.py
| | |-- __init__.pyc
| | |-- models.py
| | |-- models.pyc
| | |-- tests.py
| | `-- views.py
| |-- settings.py
| |-- settings.pyc
| |-- urls.py
| |-- urls.pyc
| |-- wsgi.py
| `-- wsgi.pyc
`-- manage.py
мой файл manage.py:
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djproject.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
Затем я запускаю "python manage.py shell", в которой находится папка того же уровня с файлом "manage.py".
И тогда я набираю "из jobs.models import Job".
Ошибки как следует (относительный путь):
>>> from jobs.models import Job
Traceback (most recent call last):
File "<console>", line 1, in <module>
ImportError: No module named jobs.models
но, если я использую полный путь
>>> from djproject.jobs.models import Job
ошибка исчезает, почему?
3 ответа
Это как и ожидалось, потому что вы сейчас работаете manage.py
из другого каталога, чем в предыдущих версиях Django. См. Обновленный макет проекта по умолчанию и manage.py в документации Django для получения дополнительной информации.
Вы сейчас начинаете manage.py
из более высокого каталога в дереве, поэтому вам нужно будет включить djproject
при импорте кода. В документации также содержится предложение о том, как сделать это по-другому (если хотите):
Все, что импортируется как модуль верхнего уровня, может быть размещено рядом с новым manage.py. Например, чтобы отделить "myapp" от модуля проекта и импортировать его как просто myapp, поместите его вне каталога mysite/:
manage.py
myapp/
__init__.py
models.py
mysite/
__init__.py
settings.py
urls.py
Перемещение manage.py на 1 уровень вниз (внутри djproject/djproject/) должно помочь. Тогда Вы сможете импортировать модули так, как Вы хотите:
from jobs.models import Job
import sys
sys.path.append('/home/python/djproject/djproject')
После того, как я добавляю это в setting.py, он работает.(Как сказано в Internal Server Error.) И я "mv" myapp(jobs) в ту же папку с manage.py, он тоже работает (как сказал Симеон Виссер.)