我有一个看起来像
的字符串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 %}
由于字符串不在文件中,因此不能仅将其文件名指定给模板呈现引擎。有什么想法吗?
答案 0 :(得分: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版开始)。
在这个问题中有一个例子:How do I use Django's template extends variable?
答案 1 :(得分:3)
事实证明,实现这一目标的方法更为简单:
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'标记中的变量。