gpt4 book ai didi

Django - 根据每个请求使用自定义模板加载器?

转载 作者:行者123 更新时间:2023-12-04 18:19:12 27 4
gpt4 key购买 nike

是否有一种较低级别的方法可以在渲染模板时提供加载器列表,而不是始终让 Django 使用该设置?

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

最佳答案

看起来您必须自己编写一些代码才能做到这一点。让我们看一下加载模板的正常代码路径,如果您使用 render_to_response,其中 the source 的相关部分是:

return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

这是对 django.template.loader.render_to_string 的调用,它传递了一些其他函数并最终调用 find_template .

第一次调用 find_template 时,会根据 settings.TEMPLATE_LOADERS 初始化全局 template_source_loaders 缓存。所以看起来你不仅可以传入额外的参数或类似的东西。

一种可能是在该 View 的持续时间内向 django.template.loader.template_source_loaders 添加一些加载器。我不知道这是否会导致其他问题;感觉很脏,但如果有效的话,那就很容易了。 (只需创建一个 View 装饰器即可完成此操作。)

如果您不想这样做,看起来您必须使用自己的代码复制 render_to_string 的工作(如果您确实确定要使用 per-查看模板加载器,为了这个问题我接受它作为前提,但我打赌实际上没有必要)。那里没有那么多代码,如果您提前知道要使用的特定加载器和单个模板名称,那么实际上非常简单。 (这尚未经过测试,但可能会很有效。)

 def render_to_response_with_loader(loader, name,
dictionary=None, context_instance=None, mimetype=None, dirs=None):

# from find_template
t, display_name = loader(name, dirs)

# from get_template
if not hasattr(t, 'render'):
# template needs to be compiled
t = django.template.loader.get_template_from_string(t, origin, template_name)

# from render_to_string
if not context_instance:
rendered = t.render(Context(dictionary))
else:
# Add the dictionary to the context stack, ensuring it gets removed again
# to keep the context_instance in the same state it started in.
context_instance.update(dictionary)
try:
rendered = t.render(context_instance)
finally:
context_instance.pop()

# from render_to_response
return HttpResponse(rendered, mimetype=mimetype)

如果您想支持多个可能的加载器或可能的文件名列表,只需从 django.template.loader 复制相关代码即可.

关于Django - 根据每个请求使用自定义模板加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11038610/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com