14

我有一个关于将 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 抛出错误消息“没有名为 faktura 的模块”完整的提示在这里:http ://dpaste.com/737380/

这里有什么问题,为什么只有 urls.py 找不到应用程序?如果我将它添加到PATH,它是否找不到这个应用程序?我花了一个上午试图找出问题所在,现在我需要你的帮助。

4

4 回答 4

23

除了一些可以纠正的冗余行之外,我不知道为什么前面的答案是 -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),则可以将其用作导入路径的一部分。无论部署方法如何,这都应该有效,无需额外配置。

于 2014-01-26T10:01:44.283 回答
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

就在 if __name__ == "__main__" 之前:添加:

sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))

于 2012-04-25T10:24:48.060 回答
1

使用BASE_DIR来自settings.py. 它应该已经定义:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

最好不要使用 and 中的属性__file__,因为它们位于不同的目录中。manage.pywsgi.py

因此,只需将以下内容添加到manage.pyand wsgi.py(以及celery.py如果您使用 Celery):

    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
于 2017-01-22T22:23:35.743 回答
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/获得了这个答案

于 2014-07-03T06:08:21.777 回答