我正在构建一个Django应用程序,我正在迁移到Heroku和Heroku Postgres。当我运行“python manage.py runserver”甚至“heroku运行python manage.py runserver”终端返回错误“错误:没有名为filename的模块” - 文件名是app文件夹,位于我的主项目文件夹中,包含我的models.py和views.py文件等。请参阅下面的文件结构。
我在我安装的应用程序中列出了app文件夹,当我为projectname运行“ls”时它出现了,所以我很困惑为什么找不到它。
我已经使用startapp启动了一个新的应用程序,并将旧的内容移到了上面,看看它是不是异常。这似乎只是因为试图让Heroku工作而发生。
这是我这个项目的文件结构:
projectname/
manage.py
requirements.txt
Procfile
projectname/
templates/
__init__.py
settings.py
urls.py
wsgi.py
filename/
__init__.py
admin.py
models.py
tests.py
urls.py
views.py
static/
venv/
我一直在努力争取这一天超过一天,所以任何有关如何通过它的帮助将非常感激!
编辑:以下是我在代码中提到文件名的所有地方:
我在venv中运行'heroku run python manage.py syncdb',它仍然返回错误“错误:没有名为filename的模块”。
答案 0 :(得分:2)
我想这一行
In admin.py as 'from projectname.filename.models import *'
正在提出问题。 projectname
部分恕我直言不应该在那里,所以该行应该只读
from filename.models import *
<强> [编辑] 强>
并且projectname
和filename
都应该在INSTALLED_APPS
中。
并在我的思路上解释更多。您的projectname.filename
引用内部projectname
文件夹,因此我认为它正在尝试查找不存在的projectname/projectname/filename.py
文件。只需将filename
添加到INSTALLED_APPS
即可使范围全局可用,因此可以称为原样。
答案 1 :(得分:0)
我有一个例程,我用它来转储整个Django模块路径。 re.sub()s
只是为了缩短某些路径,让您更容易看到其中的位置。
import sys, re, os
def ModuleList():
ret = []
dir_project = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
project_name = os.path.basename(dir_project)
for k,v in sys.modules.items():
x = str(v)
if 'built-in' in x:
ret.append((k, 'built-in'))
continue
m = re.search(r"^.*?'(?P<module>.*?)' from '(?P<file>.*?)'.*$", x)
if m:
d = m.groupdict()
f = d['file']
f = re.sub(r'/usr/local/lib/python[.0-9]*/site-packages/django/', 'system django >> ', f)
f = re.sub(r'/usr/local/lib/python[.0-9]*/site-packages/', 'site-packages >> ', f)
f = re.sub(r'/usr/local/lib/python[.0-9]*/', 'python >> ', f)
f = re.sub(dir_project+'.*django/', 'local django >> ', f)
f = re.sub(dir_project+r'(/\.\./)?', project_name + ' >> ', f)
ret.append((d['module'], f))
ret.sort( lambda a,b: cmp(a[0].lower(), b[0].lower()) )
return ret
# ModuleList
if __name__ == "__main__":
for x in ModuleList():
print "%s\t%s" % (x[0], x[1])
答案 2 :(得分:0)
你在/ venv吗?忘记进入虚拟环境后,我遇到了类似的错误。要从终端执行此操作,请尝试:
$ source venv/bin/activate