2016-12-29 76 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