有没有办法让Django的模板加载器运行它加载的所有模板(即直接或通过扩展/包含)通过SHPAML,如果它认为HTML已过期?
我知道如何在整个目录上递归调用SHPAML,但我希望能够按需运行它,所以每次更改SHPAML源时我都不必记住同步HTML。
我想从manage.py调用SHPAML也会起作用(至少对于测试服务器而言),但能够入侵Django的模板引擎并使其运行通过预处理器加载的每个文件都会更好。
答案 0 :(得分:3)
我怀疑你可以通过继承django.template.loaders.app_directories.Loader
(或者你使用的任何加载器)并覆盖load_template_source
方法来实现你想要的东西,例如:
from django.template.loaders.app_directories import Loader
from shpaml import convert_text
class SHPAMLLoader(Loader):
def load_template_source(self, *args, **kwargs):
shpaml_source = super(SHPAMLLoader, self).load_template_source(*args, **kwargs)
html = convert_text(shpaml_source)
return html
然后将您的加载程序放在settings.py中TEMPLATE_LOADERS
元组的开头。当然,每次加载模板时,您都将进行SHPAML到HTML舞蹈,因此您可能会看到一些开销。即将推出的Django 1.2具有模板缓存功能,可以帮助减轻开销......
免责声明:此代码完全未经测试,抱歉。
答案 1 :(得分:1)
刚刚在piquadrat的答案中创建了一个基于片段的项目。这是一个更完整的功能,支持django 1.1和1.2(也可能是1.0)
认为它可能会为未来派上用场:)