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

时间:2010-01-30 08:21:16

标签: django-templates

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

这意味着我需要模板引擎从字符串而不是从文件加载模板。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:5)

为了补充Ignacio Vazquez-Abrams的the answer,这里是我用来从字符串中获取模板对象的代码片段:

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方法将使用django.template.Template作为其第一个参数实例化template_string对象,使用settings.TEMPLATES的第一个后端,但不会导致错误。

答案 2 :(得分:5)

在Django 3上使用django Template和Context对我有用。

>>> df_1
    Item_1  Item_1
    i_1     i_2
    i_1     i_3
    i_1     i_4
    i_5     i_6
    i_5     i_7

>>> df_2
    ID  Item    Valid_From  Valid_To
    1   i_1     2007-01-01  2030-01-01  <-- Overlap
    1   i_2     2007-01-01  2030-01-01  <-- Overlap
    1   i_5     2007-01-01  2013-12-31  <-- No Overlap
    1   i_6     2014-01-01  2030-01-01  <-- No Overlap
    2   i_1     2007-01-01  2011-12-31  <-- No Overlap
    2   i_4     2012-01-01  2030-01-01  <-- No Overlap
    2   i_10    2012-01-01  2018-12-31  <-- Not in df_1 => Not relevant
    2   i_11    2012-01-01  2018-12-31  <-- Not in df_1 => Not relevant
    2   i_7     2012-01-01  2018-12-31  <-- In df_1, but no match