1

私の問題は、Django テンプレートの extends タグが親ディレクトリの基本テンプレートを参照できなかったときに始まりました。この質問1には問題に対する非常に適切な回答がありますが、appengine のデフォルトの template.render 関数によって提供される暗黙的なテンプレート キャッシュが無効になります。

回答の著者は、このテンプレート キャッシュを実装するのはかなり簡単だとも述べていますが、この種の機能を改ざんすると、将来的にバグが発生すると思います。助言がありますか?

4

1 に答える 1

0

すべてのテンプレートディレクトリは1つのテンプレートディレクトリのサブフォルダであるため、ローダーに最初にそこを参照させる必要がありました。

これがテンプレートのキャッシュを壊すかどうか/どのように壊すかはテストしていませんが、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 に答える