Django项目的目录结构和Python路径

6

我希望从一开始就为我的 Django 项目设置最佳环境,并且在目录结构中遇到了一些问题。我已经建立了 virtualenv(在此示例中为 env),以便为每个 Django 项目部署一个干净的空 Python 环境。

基本结构如下:

/env/
    /bin
    /db         <--- Django DB
    /downloads
    /lib
    /static     <--- Where css/imgs/js etc is served from
    /project/   <--- Django root
            /__init__.py
            /settings.py
            /manage.py
            /appsfolder/
                 /appname/
                       /__init__.py
                       /models/
                              /__init__.py
                              /somemodel.py
                       /urls/
                             /__init__.py
                             /someurl.py
                       /views/
                             /__init__.py
                             /someview.py

这是基本布局; 我希望每个项目都有一个应用程序目录,在每个应用程序中都有一个单独的文件夹用于模型、视图和URL。我遇到的问题是Python路径以及如何处理模块的问题。在应用程序内部,我不想在导入模型时引用项目,即我应该使用:
import appname.models.modelname

注意:

import projectname.models.modelname

为了帮助重复使用

在模型目录中,我有以下init.py文件。

from model1 import ModelName1
from model2 import ModelName2
from model3 import ModelName3

__all__ = ['ModelName1', 'ModelName2', 'ModelName3']

但是当我尝试使用一个单独的url文件(在/appname/urls/urlfile.py中)并像下面这样导入模型时:

from appname.models.somemodel import ModelName

I get a "module not found" error.

while:

from appsfolder.appname.models.somemodel import ModelName

运行良好

我猜这是因为应用程序不直接在Python路径上,而是在名为appsfolder的子文件夹中,但我不确定如何修复它,同时保持所有内容可重用和相对。

我知道一个解决方案是将所有应用程序直接放在site-packages下的Python路径下,但我不太喜欢这个想法,因为如果您正在使用virtualenv,则认为应用程序应该在项目中。

1个回答

16
您可以在settings.py中添加以下内容,将您的appsfolder添加到您的PYTHONPATH中。
import os
import sys

PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))

这对于在项目根目录中拆分自己的appviews文件夹非常有用。他们为templates有一个,为什么不为视图也有一个呢? - yurisich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接