2010-01-30 74 views
25

我决定将所有系统电子邮件的模板保存在数据库中。 这些电子邮件的正文是正常的Django模板(带标签)。从字符串而不是从文件加载模板

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

+0

几年后再次发现这一点,并希望我能再次upvote。 – dbn 2016-03-08 00:48:20

回答

26

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

+2

这不会使用'settings.TEMPLATES ['BACKEND']中配置的后端,但始终使用Django的模板系统。有没有一种方法可以从配置了后端的字符串创建模板? – Feuermurmel 2016-07-04 10:44:51

+0

从设置中获取后端,查找要使用哪个Template()(有地图或内省)并实例化它。 – kaleissin 2017-01-06 19:36:50

2

,以补充伊格纳西奥巴斯克斯 - 艾布拉姆斯的答案,这里是我用来从字符串得到一个模板对象的代码片段:

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的第一个后端,不会导致错误。

相关问题