我有一个关于将django应用程序放入“apps”子目录的问题。我在project_root中有一个名为“faktura”的应用程序。我不喜欢它在那里的事实,我想将我的所有应用程序存储在“apps”子目录下。
所以,我发现我可以将python路径扩展到“apps”子目录,所以在查看互联网后,我将此字符串添加到settings.py:sys.path.insert(0,os.path.join( PROJECT_PATH,“apps”))。然后我将应用程序添加到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中它是否找不到这个应用程序?我花了一个上午试图弄清楚什么是错的,现在我需要你的帮助。
答案 0 :(得分:13)
我不知道为什么前面的答案除了可以纠正的一些冗余线之外还有-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
目录设为python包(通过添加__init__.py
),则可以将其用作导入路径的一部分。无论部署方法如何,这都应该有效,无需额外配置。
答案 1 :(得分:1)
要将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
如果__name__ ==“__ main__”之前:添加:
sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))
答案 2 :(得分:1)
使用BASE_DIR
中的settings.py
变量。它应该已经定义:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
最好不要使用__file__
和manage.py
中的wsgi.py
属性,因为它们位于不同的目录中。
因此,只需将以下内容添加到manage.py
和wsgi.py
(如果您使用Celery,则添加到celery.py
):
from django.conf import settings
sys.path.append(os.path.join(settings.BASE_DIR, "apps"))
您最终会得到以下项目结构:
project
├── project
│ ├── __init__.py
│ ├── celery.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── apps
│ ├── app1
│ └── app2
└── manage.py
答案 3 :(得分:0)
@Radu Gheorghiu的回答;无需编辑settings.py,插入路径行可以压缩为1行代码。
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "apps"))
我从http://obroll.com/nested-application-inside-apps-sub-folder-in-django-1-3/
收到了这个答案