1

当 Django 模板中的扩展标签无法引用父目录中的基本模板时,我的问题就开始了。这个问题1对问题有很好的回答,但是它禁用了appengine中默认的template.render函数提供的隐式模板缓存。

答案的作者还提到,实现这个模板缓存会相当简单,但我觉得篡改这种功能会在未来产生错误。有什么建议么?

4

1 回答 1

0

我们所有的模板目录都是一个模板目录的子文件夹,所以我们只需要让加载器首先查看那里。

我没有测试这是否/如何破坏模板缓存,但它不会改变行为 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')
于 2012-10-12T22:38:11.073 回答