按照答案中的目录结构:
Best practice for Django project working directory structure
在此处查看GitHub上的代码以进行问题排查:
我将manage.py
移到scripts
目录中。我修改了manage.py
和wsgi.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'
。在xyz
之前填写settings
任何内容。
另外,如上所示,我的项目并非像第一个链接中讨论的那样100%实现。我的settings.py
仍在默认位置。它基本上看起来像这样:
~/projects/django-project
/proj_dir
settings.py
urls.py
wsgi.py
/scripts
manage.py
另外,我尝试了这个,因为我认为它可能在proj_dir
中寻找scripts
,我实际上希望它上升到一个级别来寻找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'
那时我开始讨论import
和from . import
因为文档说错误与此有关。仍无法解决问题。
答案 0 :(得分:4)
如果您已将manage.py
移至scripts
目录,则必须将父目录显式添加到python路径。
sys.path.append('..')
不应更改设置DJANGO_SETTINGS_MODULE
环境变量的行。保持为
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings")
答案 1 :(得分:0)
&#34; {{project_name}}&#34;似乎是占位符 - manage.py不是模板,并且您没有使用模板语法将变量放在os.environ.setdefault()的字符串中。
您需要使用正确的项目名称/模块名称。在示例repo中,正确的项目名称将是&#34; project_name&#34; (没有大括号),例如&#34; project_name.settings.development&#34;如果您使用该回购中指定的开发设置。
您看到的错误清楚地表明了行为,因为它正在寻找名为&#34; {{project_name}}&#34;的模块。因为这是提供的顶级(用点分隔)python模块名称,它不存在。