如何从python字符串扩展django模板

时间:2011-07-29 03:50:36

标签: python django django-templates

我有一个看起来像

的字符串
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 个答案:

答案 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(你不能在字符串模板中使用extendsblock标签。虽然它在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'标记中的变量。