如何从Python字符串中扩展Django模板

3

我有一个看起来像这样的字符串

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上无法运行,可能是由于错误#7377(您不能在字符串模板中使用extendsblock标记)导致的。但在1.2中可以正常工作。所以如果您正在运行1.3,您可以查看此问题的历史记录并使用我的hack :)
extends 模板标签允许您指定一个变量名称(自版本1.0以来)。
这个问题有一个使用它的例子:如何使用Django的模板扩展变量?

这仅允许您扩展物理文件。如果您想要扩展包含在Python字符串变量中的某些HTML模板(例如,strHTML ='<html>{% block content %}{% endblock %}</html>'),该怎么办? - Trevor
抱歉,我读错了你的问题。请看更新。这是个一流的黑客技巧,但它有效。 - Seth

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”标记中的变量。


+1 没想到它的工作方式是这样的!这比我的hack要好多了 :) - Seth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接