Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-在每个请求的基础上使用自定义模板加载器?_Django_Django Templates - Fatal编程技术网

Django-在每个请求的基础上使用自定义模板加载器?

Django-在每个请求的基础上使用自定义模板加载器?,django,django-templates,Django,Django Templates,在呈现模板时,是否有一种较低级别的方法来提供加载程序列表,而不是让Django始终使用该设置 我只想在少数视图中使用自定义模板加载器实例(我有我的理由)。看起来您需要自己编写一些代码才能做到这一点。让我们看一下加载模板的正常代码路径,如果您使用,例如,代码> ReNordSotoRebug < /代码>,其中相关的部分是: 这是对的调用,它通过一些其他函数最终调用 第一次调用find_template,in将根据设置初始化全局模板源加载程序缓存。模板加载程序。所以看起来没有什么额外的论点可以传进

在呈现模板时,是否有一种较低级别的方法来提供加载程序列表,而不是让Django始终使用该设置


我只想在少数视图中使用自定义模板加载器实例(我有我的理由)。

看起来您需要自己编写一些代码才能做到这一点。让我们看一下加载模板的正常代码路径,如果您使用,例如,代码> 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