自问自答:
读了下django 0.96 和 1.2 的源码,对比了一下 django.template.loaders.file_system 这个模块。
发现 Loader 类的 get_template_sources 方法中,文件路径的结合方式不同。
0.96 使用的是普通的 os.path.join 方法,1.2 使用的是 django.utils._os.safe_join 方法,后者限制不允许使用 base path 外的路径。而 include 和 extends 标签会先从base path开始寻找模板(这也许是bug?),如果路径里边有 “../” 可能会直接跳出这个 base path ,于是就会触发找不到模板的异常:
引用(django.utils._os.safe_join):
def safe_join(base, *paths):
"""
Joins one or more path components to the base path component intelligently.
Returns a normalized, absolute version of the final path.
The final path must be located inside of the base path component (otherwise
a ValueError is raised).
"""
#...
举例:
>>> from django.utils._os import safe_join
>>> safe_join('templates','../bbb.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\site-packages\django\utils\
_os.py", line 44, in safe_joi
n
raise ValueError('the joined path is located outside of the base path'
ValueError: the joined path is located outside of the base path component
>>>
看来,在 django 1.2 模板中,不能 include 或 extends 上层目录的模板。