Django-在每个请求的基础上使用自定义模板加载器?
在呈现模板时,是否有一种较低级别的方法来提供加载程序列表,而不是让Django始终使用该设置Django-在每个请求的基础上使用自定义模板加载器?,django,django-templates,Django,Django Templates,在呈现模板时,是否有一种较低级别的方法来提供加载程序列表,而不是让Django始终使用该设置 我只想在少数视图中使用自定义模板加载器实例(我有我的理由)。看起来您需要自己编写一些代码才能做到这一点。让我们看一下加载模板的正常代码路径,如果您使用,例如,代码> ReNordSotoRebug < /代码>,其中相关的部分是: 这是对的调用,它通过一些其他函数最终调用 第一次调用find_template,in将根据设置初始化全局模板源加载程序缓存。模板加载程序。所以看起来没有什么额外的论点可以传进
我只想在少数视图中使用自定义模板加载器实例(我有我的理由)。看起来您需要自己编写一些代码才能做到这一点。让我们看一下加载模板的正常代码路径,如果您使用,例如,代码> ReNordSotoRebug < /代码>,其中相关的部分是: 这是对的调用,它通过一些其他函数最终调用 第一次调用
find_template
,in将根据设置初始化全局模板源加载程序
缓存。模板加载程序
。所以看起来没有什么额外的论点可以传进去或者类似的东西
一种可能是在视图期间向django.template.loader.template\u source\u loaders添加一些加载程序。我不知道这是否会导致其他问题;它摸起来很脏,但如果它起作用,那就很容易了。(只需制作一个视图装饰器即可。)
如果您不想这样做,看起来您必须用自己的代码复制render_to_string
的工作(如果您真的确定要使用逐视图模板加载程序,出于这个问题的考虑,我接受它作为前提,但我敢打赌实际上没有必要)。这里没有那么多代码,如果您事先知道要使用的特定加载程序和单个模板名称,那么实际上非常简单。(这是未经测试的,但可能会非常有效。)
如果您想支持多个可能的加载程序或可能的文件名列表,只需从中复制相关代码即可。看起来您需要自己编写一些代码才能做到这一点。让我们看一下加载模板的正常代码路径,如果您使用,例如,代码> ReNordSotoRebug < /代码>,其中相关的部分是: 这是对的调用,它通过一些其他函数最终调用 第一次调用
find_template
,in将根据设置初始化全局模板源加载程序
缓存。模板加载程序
。所以看起来没有什么额外的论点可以传进去或者类似的东西
一种可能是在视图期间向django.template.loader.template\u source\u loaders添加一些加载程序。我不知道这是否会导致其他问题;它摸起来很脏,但如果它起作用,那就很容易了。(只需制作一个视图装饰器即可。)
如果您不想这样做,看起来您必须用自己的代码复制render_to_string
的工作(如果您真的确定要使用逐视图模板加载程序,出于这个问题的考虑,我接受它作为前提,但我敢打赌实际上没有必要)。这里没有那么多代码,如果您事先知道要使用的特定加载程序和单个模板名称,那么实际上非常简单。(这是未经测试的,但可能会非常有效。)
如果您想支持多个可能的加载程序或可能的文件名列表,只需从中复制相关代码。我最终按照Dougal的建议修改了template\u source\u加载程序。正如他所说,我不确定这是否安全(它是否会创造一个比赛条件?),但它目前适用于我的特殊情况。与Dougal建议的另一种方法相比,这种方法的好处是确保{%extends%}和{%include%}也使用修改后的加载程序。以下是我的带有自定义加载程序的render_to_字符串:
def render_to_string_with_loader(*args, **kwargs):
""" Call render_to_string using ReportTemplateLoader to find templates. """
import django.template.loader as loader
old_loaders = settings.TEMPLATE_LOADERS
settings.TEMPLATE_LOADERS = ('main.loaders.ReportTemplateLoader',)
loader.template_source_loaders = None # force refresh from settings
try:
out = render_to_string(*args, **kwargs)
finally:
# use finally make sure template errors can't mess up later requests
settings.TEMPLATE_LOADERS = old_loaders
loader.template_source_loaders = None
最后,我按照Dougal的建议修改了模板加载程序。正如他所说,我不确定这是否安全(它是否会创造一个比赛条件?),但它目前适用于我的特殊情况。与Dougal建议的另一种方法相比,这种方法的好处是确保{%extends%}和{%include%}也使用修改后的加载程序。以下是我的带有自定义加载程序的render_to_字符串:
def render_to_string_with_loader(*args, **kwargs):
""" Call render_to_string using ReportTemplateLoader to find templates. """
import django.template.loader as loader
old_loaders = settings.TEMPLATE_LOADERS
settings.TEMPLATE_LOADERS = ('main.loaders.ReportTemplateLoader',)
loader.template_source_loaders = None # force refresh from settings
try:
out = render_to_string(*args, **kwargs)
finally:
# use finally make sure template errors can't mess up later requests
settings.TEMPLATE_LOADERS = old_loaders
loader.template_source_loaders = None
def render_to_string_with_loader(*args, **kwargs):
""" Call render_to_string using ReportTemplateLoader to find templates. """
import django.template.loader as loader
old_loaders = settings.TEMPLATE_LOADERS
settings.TEMPLATE_LOADERS = ('main.loaders.ReportTemplateLoader',)
loader.template_source_loaders = None # force refresh from settings
try:
out = render_to_string(*args, **kwargs)
finally:
# use finally make sure template errors can't mess up later requests
settings.TEMPLATE_LOADERS = old_loaders
loader.template_source_loaders = None