Tim*_*s83 11 django django-apps django-settings
我有一个关于将django应用程序放入"apps"子目录的问题.我在project_root中有一个名为"faktura"的应用程序.我不喜欢它在那里的事实,我想将我的所有应用程序存储在"apps"子目录下.
所以,我发现我可以将python路径扩展到"apps"子目录,所以在查看了互联网后,我将这个字符串添加到了settings.py:sys.path.insert(0,os.path.join(PROJECT_PATH,"应用")).然后我将应用程序添加到INSTALLED_APPS,如"faktura".一切顺利,直到我将url(r'^ faktura /',include('faktura.urls'))添加到根目录中的urls.py.从那以后,Django抛出错误信息"No module named faktura"full taceback就在这里:http://dpaste.com/737380/
这里有什么问题,为什么只有urls.py无法找到应用程序?如果我把它添加到PATH中它是否找不到这个应用程序?我花了一个上午试图弄清楚什么是错的,现在我需要你的帮助.
Phi*_*sch 16
我不知道为什么前面的答案得到-1除了可能纠正的一些冗余线.无论如何,我发现了一个稍微不同的方法,不涉及向python路径添加任何内容.
这是我的最终目录结构,我稍后会解释:
mysite
??? mysite
?   ??? __init__.py
?   ??? settings.py
?   ??? urls.py
?   ??? wsgi.py
??? apps
?   ??? __init__.py
?   ??? myfirstapp
?       ??? __init__.py
?       ??? admin.py
?       ??? models.py
?       ??? tests.py
?       ??? views.py
??? manage.py
无论您是刚创建项目还是要移动应用程序,apps都要创建应包含应用程序的子目录.诀窍是添加__init__.py到该目录.
mkdir apps
touch apps/__init__.py
现在,您可以将现有应用程序移动到apps子目录中.如果你想创建一个新的,那么命令是:
python manage.py mysecondapp
mv mysecondapp apps/
警告:不要试图打电话python manage.py ./apps/mysecondapp.由于某种原因,这将删除该目录中的所有其他应用程序.我只是以这种方式失去了一天的工作.
接下来,您需要修复一些导入.你的settings.py前缀应该是apps:
INSTALLED_APPS = (
    ...
    'apps.myfirstapp',
    'apps.mysecondapp'
)
最后,修复您的项目urls.py前缀apps:
urlpatterns = patterns('', 
  url(r'^myfirstapp', include('apps.myfirstapp.urls')),
  ...
)
根据您编写它们的方式,您可能还需要在应用程序中修复一些导入.要么使用from models import MyFirstModel也要使用前缀from apps.myfirstapp.models import MyFirstModel.
简而言之,如果您将apps目录__init__.py设为python包(通过添加),则可以将其用作导入路径的一部分.无论部署方法如何,这都应该有效,无需额外配置.
要将 Django 应用程序保存在子文件夹中(例如 apps/),请首先将以下内容添加到 settings.py 中:
import os
PROJECT_ROOT = os.path.dirname(__file__)
然后在manage.py中:
在 #!/usr/bin/env python 下添加:
import sys
from os.path import abspath, dirname, join
from site import addsitedir
在 if __name__ == "__main__" 之前:添加:
sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))