如何从Python字符串扩展Django模板
我有一个看起来像这样的字符串:
string '''
<html>
<head>
{% block head %}{% endblock %}
... other stuff ...
</head>
<body>
{% block body %}{% endblock %}
... other stuff ...
</body>
</html>
'''
我想让下面这个Django模板从上面的字符串继承:
{% block head %}
... other stuff ...
{% endblock %}
{% block body %}
<h1>Other stuff</h1>
{% endblock %}
因为这个字符串不在文件里,所以我不能直接给模板渲染引擎指定一个文件名。有没有什么好主意?
2 个回答
6
为了实现仅使用字符串的模板扩展器,你可能需要自己实现一个模板加载器。其实,有一个更简单的解决方案,就是使用threed下面的建议。在上下文中传递一个父级的Template()
,而不是磁盘模板的名称。
>>> from django.template import Context, Template
>>> extend_me = Template("Before A. {% block a %}{% endblock %}. After A")
>>> str_template = "{% extends parent %} {% block a %}This is inside A{% endblock %}"
>>> Template(str_template).render(Context({"parent": extend_me}))
u'Before A. This is inside A. After A'
不幸的是,这在django 1.3上似乎不太好使,可能是因为bug #7377(你不能在字符串模板中使用extends
和block
标签)。不过在1.2版本上是可以正常工作的。所以如果你正在使用1.3版本,可以查一下这个问题的历史,看看我用的解决办法 :)
extends模板标签允许你指定一个变量名(从1.0版本开始)。
在这个问题中有一个使用示例:我该如何使用Django的模板扩展变量?
4
其实还有一种更简单的方法可以做到这一点:
from google.appengine.ext.webapp import template
parent = template.Template("<html><body>{% block content %}{% endblock %}</body></html>")
path = os.path.join(os.path.dirname(__file__), 'index.html')
template.render(path, template.Context({"baseTemplate": parent}))
这里的index.html文件看起来是这样的:
{% extends baseTemplate %}
{% block content %}
<h1>Hello World!</h1>
{% endblock %}
在这种情况下,模板对象(不是单纯的字符串)被传递到子模板的上下文中,并作为'extends'标签中的变量使用。