Django模板相对路径

0 投票
1 回答
2787 浏览
提问于 2025-04-18 06:16
import os.path

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

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
   #os.path.join(BASE_DIR,'templates'),
)

我想知道 TEMPLATE_DIRS 到底是什么,所以我在 Django 的命令行里试了一下。

>>> import os.path
>>> os.path.dirname(__file__)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name '__file__' is not defined

为什么这种合法的属性在命令行里会失败呢?我在命令行里做了一些测试,结果又出现了另一个问题:

>>> os.path.dirname(os.path.dirname('/user/name'))
'/'
>>> os.path.dirname('/user/name')
'/user'
>>> B = os.path.dirname(os.path.dirname('/user/name'))
>>> os.path.join(B,'template')
'/template'

这段带注释的代码,os.path.join(BASE_DIR,'templates'),难道不会输出 '/templates' 吗?这不是根目录吗?如果是这样,Django 怎么能在我根本没有这个目录的情况下去找我的模板文件呢?

1 个回答

3

在Python的命令行中,__file__这个变量是不存在的。所以你不能直接用这种方式来测试它的值。

BASE_DIR的值会等于包含这行代码的文件的上级文件夹。如果你有一个Django项目,而这行代码在/home/xyz/foo/foo/settings.py这个文件里,那么BASE_DIR的值就是/home/xyz/foo

为什么呢?因为__file__会返回当前文件的绝对路径,这里就是我们的settings.py。接着,你会向上取两次文件夹。第一次取的是/home/xyz/foo/foo/(这时文件名被去掉了),第二次取的是上级文件夹。这样一来,我们就到了项目的主文件夹。

另外,你不需要把\\替换成/,因为Python的os.path模块会根据你当前的操作系统自动处理这个问题。

总之,你当前的代码指向的是你Django项目根目录下的templates/文件夹 :)

撰写回答