2016-12-29 80 views
0

错误的项目设置相对进口继在回答这里的目录结构:的Django的导致移动manage.py文件

Best practice for Django project working directory structure

发表在GitHub上这里的代码来解决:

django-start-template

我将manage.py转换为scripts目录。我修改了manage.pywsgi.py有这些行:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings") 

而不是默认的:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings") 

我认为这是基本相当。

无论如何,这是我得到的错误,当我运行python manage.py runserver

File "C:\Users\ISH~1\DJANGO~1\lib\importlib\__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked 
ImportError: No module named '{{ project_name }}' 

我已经使用相对进口试过,但真的没有得到任何地方来解决问题。作为一个新手,我相信答案是非常明显的,但我已经花了几个小时阅读这个问题,并没有真正到达任何地方。

一个建议增加from . import *但这只是导致:

Traceback (most recent call last): 
    File "manage.py", line 4, in <module> 
    from . import * 
SystemError: Parent module '' not loaded, cannot perform relative import 

virtualenv是主动和我从正确的目录中运行manage.py。当它不在/scripts/中时可以正常工作。

编辑:

我没有提到,但是这一点,无论在manage.py是:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings") 

或者:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name)).settings") 

结果总是ImportError: No Module named 'xyz'。在settings之前填写xyz

此外,上述表明,我的项目不是像第一个链接讨论的那样100%实施。我的settings.py仍处于默认位置。它看起来像这样基本上是:

~/projects/django-project 

/proj_dir 
    settings.py 
    urls.py 
    wsgi.py 
/scripts 
    manage.py 

而且,我想这是因为我在scripts想好了就可能会寻找proj_dir实际上我希望它升了一级,以寻找proj_dir

os.environ.setdefault("DJANGO_SETTINGS_MODULE", ".proj_dir.settings") 

这只是带来了以下错误。

TypeError: the 'package' argument is required to perform a relative import for '.proj_dir.settings' 

这是当我开始与importfrom . import乱搞,因为文件是说错误是涉及到这一点。仍然无法解决这个问题。

回答

2

如果您已将manage.py移动到scripts目录,则必须将父目录显式添加到python路径。

sys.path.append('..') 

设置DJANGO_SETTINGS_MODULE环境变量的行不应该改变。保留为

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings") 
+0

Hallelujah ......这个伎俩。知道这是简单的事情。 – sockpuppet

0

“{{project_name}}”似乎是一个占位符 - manage.py不是模板,而且您也没有使用模板语法将变量放入os.environ.setdefault()的字符串中。

您需要使用正确的项目名称/模块名称。在示例repo中,正确的项目名称将是“project_name”(无括号),例如“project_name.settings.development”,如果您使用的是该回购中指定的开发设置。

您看到的错误清楚地表明了该行为,因为它正在查找名为“{{project_name}}”的模块,因为该模块是提供的顶级(由点分隔)python模块名称,并且它不存在。

+0

谢谢,请参阅编辑。我意识到我没有足够好地解释自己。 – sockpuppet