将django应用程序移动到子文件夹和url.py错误

时间:2012-04-25 10:06:09

标签: django django-apps django-settings

我有一个关于将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中它是否找不到这个应用程序?我花了一个上午试图弄清楚什么是错的,现在我需要你的帮助。

4 个答案:

答案 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.pywsgi.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/

收到了这个答案