如果 Django 的模板加载器认为 HTML 已过时,是否有任何方法可以让 Django 的模板加载器通过 SHPAML 运行它加载的所有模板(即直接或通过扩展/包含)?
我知道如何在整个目录上递归调用 SHPAML,但我希望能够按需运行它,这样我就不必记住每次更改 SHPAML 源时都要同步 HTML。
我想从 manage.py 调用 SHPAML 也可以(至少对于测试服务器而言),但是能够侵入 Django 的模板引擎并使其运行通过预处理器加载的每个文件会更好。
如果 Django 的模板加载器认为 HTML 已过时,是否有任何方法可以让 Django 的模板加载器通过 SHPAML 运行它加载的所有模板(即直接或通过扩展/包含)?
我知道如何在整个目录上递归调用 SHPAML,但我希望能够按需运行它,这样我就不必记住每次更改 SHPAML 源时都要同步 HTML。
我想从 manage.py 调用 SHPAML 也可以(至少对于测试服务器而言),但是能够侵入 Django 的模板引擎并使其运行通过预处理器加载的每个文件会更好。
我怀疑您可以通过继承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
TEMPLATE_LOADERS
然后把你的加载器放在你的settings.py中元组的开头。当然,每次加载模板时,您都会执行 SHPAML 到 HTML 的舞蹈,因此您可能会看到一些开销。即将推出的 Django 1.2 具有模板缓存功能,这可以帮助减轻这种开销......
免责声明:此代码完全未经测试,抱歉。
刚刚根据 piquadrat 的答案中的片段创建了一个项目。它的功能更完整,支持 django 1.1 和 1.2(也可能是 1.0)
认为它可能会在未来派上用场:)