2

我正在构建一个 Django 应用程序,并且正在迁移到 Heroku 和 Heroku Postgres。当我运行“python manage.py runserver”甚至“heroku run python manage.py runserver”时,终端返回错误“错误:没有名为文件名的模块” - 文件名是位于我的主项目文件夹中的应用程序文件夹,其中包含我的models.py 和 views.py 文件等。请参阅下面的文件结构。

我的 INSTALLED APPS 中列出了 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/

我已经为此苦苦挣扎了一天多,因此对于如何克服它的任何帮助将不胜感激!

编辑:这是我在代码中提到文件名的所有地方:

  • 在 admin.py 中作为 'from projectname.filename.models import *'
  • 在 URLconf 下的 projectname/urls.py 中作为 include('filename.urls',
    'namespace=filename')
  • 在文件名/urls.py 中为 'from filename import *' 和在 URLconf 下为 'urlpatterns = patterns('filename.views' ...)
  • 在views.py 中作为'from filename.models import *'

我也在 venv 中运行了“heroku run python manage.py syncdb”,但它仍然返回错误“错误:没有名为文件名的模块”。

4

3 回答 3

2

我认为这条线

In admin.py as 'from projectname.filename.models import *'

正在给出问题。projectname恕我直言部分不应该在那里,所以该行应该只是阅读

from filename.models import *

[编辑]

而且,两者projectnamefilename都应该在INSTALLED_APPS.

并更多地解释我的思路。您projectname.filename指的是内部projectname文件夹,所以我认为它正在尝试查找projectname/projectname/filename.py不存在的文件。只需添加filenametoINSTALLED_APPS将使范围全局可用,因此可以按原样引用。

于 2013-01-02T10:16:02.253 回答
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])
于 2013-01-01T20:08:49.543 回答
0

你在 /venv 吗?忘记进入虚拟环境后,我也遇到过类似的错误。要从终端执行此操作,请尝试:

$ source venv/bin/activate

于 2013-01-02T05:31:37.900 回答