从字符串而不是从文件加载模板

Posted

技术标签:

【中文标题】从字符串而不是从文件加载模板【英文标题】:Load template from a string instead of from a file 【发布时间】:2011-01-11 03:44:40 【问题描述】:

我决定将所有系统电子邮件的模板保存在数据库中。 这些邮件的正文是普通的 django 模板(带有标签)。

这意味着我需要模板引擎从字符串而不是文件加载模板。有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

在 >= Django 3 上使用 django Template 和 Context 为我工作。

from django.template import Template, Context

template = Template('Hello name.')
context = Context(dict(name='World'))
rendered: str = template.render(context)

【讨论】:

【参考方案2】:

为了补充来自 Ignacio Vazquez-Abrams 的 the answer,下面是我用来从字符串中获取模板对象的代码 sn-p:

from django.template import engines, TemplateSyntaxError

def template_from_string(template_string, using=None):
    """
    Convert a string into a template object,
    using a given template engine or using the default backends 
    from settings.TEMPLATES if no engine was specified.
    """
    # This function is based on django.template.loader.get_template, 
    # but uses Engine.from_string instead of Engine.get_template.
    chain = []
    engine_list = engines.all() if using is None else [engines[using]]
    for engine in engine_list:
        try:
            return engine.from_string(template_string)
        except TemplateSyntaxError as e:
            chain.append(e)
    raise TemplateSyntaxError(template_string, chain=chain)

engine.from_string 方法将使用settings.TEMPLATES 的第一个后端实例化一个django.template.Template 对象,并将template_string 作为其第一个参数,不会导致错误。

【讨论】:

如果您可以将上下文传递给它,我会喜欢这个答案【参考方案3】:

实例化一个django.template.Template(),传递字符串以用作模板。

【讨论】:

这不会使用settings.TEMPLATES['BACKEND']中配置的后端,而是始终使用Django的模板系统。有没有办法从配置后端的字符串创建模板? 从设置中获取后端,查找要使用的 Template()(具有映射或内省)并实例化它。

以上是关于从字符串而不是从文件加载模板的主要内容,如果未能解决你的问题,请参考以下文章

从本地加载 JS 文件,而不是从 CDN

Java 程序正在从 system32 文件夹加载,而不是从它所在的文件夹加载

从数据流而不是从文件加载图像

freemarker:模板加载器:从 zip 文件加载模板

如何从页面模板上调用的函数而不是从ins获取当前页面永久链接url

Java IO学习--字节和字符数组