当 Django 模板中的扩展标签无法引用父目录中的基本模板时,我的问题就开始了。这个问题1对问题有很好的回答,但是它禁用了appengine中默认的template.render函数提供的隐式模板缓存。
答案的作者还提到,实现这个模板缓存会相当简单,但我觉得篡改这种功能会在未来产生错误。有什么建议么?
当 Django 模板中的扩展标签无法引用父目录中的基本模板时,我的问题就开始了。这个问题1对问题有很好的回答,但是它禁用了appengine中默认的template.render函数提供的隐式模板缓存。
答案的作者还提到,实现这个模板缓存会相当简单,但我觉得篡改这种功能会在未来产生错误。有什么建议么?
我们所有的模板目录都是一个模板目录的子文件夹,所以我们只需要让加载器首先查看那里。
我没有测试这是否/如何破坏模板缓存,但它不会改变行为 AFAICT。
我们通过使用这样的模块扩展基本加载器来做到这alternative_path.py
一点:
class Loader(filesystem.Loader):
"""
Looks for templates in an alternative path.
Allows a template to extend a template which is located in a specified views path.
"""
is_usable = True
__view_paths = None
def __init__(self, views_path):
if Loader.__view_paths is None:
Loader.__view_paths = [views_path]
def get_alternative_template_sources(self, template_name):
for template_dir in Loader.__view_paths:
try:
yield safe_join(template_dir, template_name)
except UnicodeDecodeError:
# The template dir name was a bytestring that wasn't valid UTF-8.
raise
except ValueError:
# The joined path was located outside of this particular
# template_dir (it might be inside another one, so this isn't
# fatal).
pass
def get_template_sources(self, template_name, template_dirs):
return itertools.chain(
filesystem.Loader.get_template_sources(self, template_name, template_dirs),
Loader.get_alternative_template_sources(self, template_name))
然后在同一个模块中:
_loader = Loader
然后在main.py
:
def main():
views_path = os.path.join(os.path.dirname(__file__), 'templates')
settings.TEMPLATE_LOADERS = (('web.rich.templates.alternative_path.Loader', views_path),
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader')