django template - 在字符串变量中解析变量

时间:2012-10-10 03:42:34

标签: django templates filter render templatetag

我将动态内容(从数据库)拉到模板。您可以将其视为一些简单的CMS系统。内容字符串包含模板变量。像这个(简化案例):

vars['current_city'] = "London"
vars['content'] = 'the current city is: {{current_city}}'  #this string comes from db
return render_template(request, 'about_me.html',vars)

然后在模板中:

{{content}}
输出很明显:
    目前的城市是:{{current_city}}
预计:
    目前的城市是:伦敦

我的问题 - 有没有办法在另一个变量中呈现变量名?使用自定义模板标签/过滤器似乎是一个好主意,但我试图创建一个没有成功...任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

拥有一个自定义标签可能会解决这个问题,但它可能会有点复杂,因为这样就有可能在模板中有一个完整的模板,因为没有什么限制你在db中保存所有模板(可能包括其他模板标签)。我认为最简单的解决方案是从db手动渲染模板字符串,然后将其作为变量传递给主模板。

from django.template import Template, Context
...
context = {
    'current_city': 'London'
}
db_template = Template('the current city is: {{current_city}}') # get from db
context['content'] = db_template.render(Context(context))
return render_template(request, 'about_me.html', context)

注意:

如果您遵循这条道路,这可能效率不高,因为每次执行视图时,都必须编译db模板。那么你可能想要缓存db的编译版本,然后只是将适当的上下文传递给它。以下是非常简单的缓存:

simple_cache = {}

def fooview(request):
    context = {
        'current_city': 'London'
    }
    db_template_string = 'the current city is: {{current_city}}'
    if simple_cache.has_key(db_template_string):
        db_template = simple_cache.get(db_template_string)
    else:
        simple_cache[db_template_string] = Template(db_template_string)
    context['content'] = db_template.render(Context(context))
    return render_template(request, 'about_me.html', context)