Django项目目录结构及Python路径

6 投票
1 回答
10895 浏览
提问于 2025-04-16 04:58

我正在尝试为我的Django项目从一开始就建立一个最佳的开发环境,但在目录结构上遇到了一些麻烦。我已经设置了虚拟环境(在这个例子中叫做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

这是基本的布局;我希望每个项目都有一个应用程序的目录,并且在每个应用程序中有一个单独的文件夹来存放模型、视图和网址。

我遇到的问题是关于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']

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

from appname.models.somemodel import ModelName

我遇到了“找不到模块”的错误。

而:

from appsfolder.appname.models.somemodel import ModelName

则可以正常工作。

我猜这是因为应用程序没有直接在Python路径上,而是在一个叫做appsfolder的子文件夹中,但我不确定该如何解决这个问题,同时又保持一切的可重用性和相对性。

我知道一个解决方案是把所有应用程序直接放在Python路径下的site-packages中,但我不太喜欢这个主意,因为我认为如果使用虚拟环境,应用程序应该在项目内部。

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'))

撰写回答