Django模板相对路径
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/
文件夹 :)