如何让Django模板在Mako模板中呈现自己?

时间:2011-03-16 22:30:06

标签: django django-templates mako templatetags

我们在很久以前就在我们的Django项目中使用Mako模板做出了决定。我们也支持Django模板,因为许多可重用的应用程序(显然)假设Django模板可用。我发现从Mako渲染Django模板是可能的,但是我还没有办法让它以相反的方式工作。

我刚刚在我们的应用列表中添加了django-articles,它使用了Django Templating。它假定base.html文件是重写的Django模板。不幸的是,我们的主站点是使用Mako构建的。我还不能在Mako中为Django模板找到一个干净的方式host

我认为我想要的是一个模板标签,它会呼叫Mako并要求“嵌入”。

我们的Mako模板目前都在执行以下操作:

<%inherit file="mako/base.html"/>

我想要的是能够从Django模板中做到这样的事情:

{% render_in_mako 'mako/base.html' 'body' %}

使用`mako / base.html'中的以下内容:

</head>
  <body>
    <%include file="header.html" />

    ${next.body()}

  </body>
</html>

以前有人必须这样做吗?我对编写模板标签不是很熟悉。你认为这可以做到吗?替代方案可能是重写Mako中的所有模板,这根本不会吸引我。对于许多使用Mako的项目,我认为模板标签非常有用。

1 个答案:

答案 0 :(得分:0)

好问题!由于Django的custom template tags,可以在Django模板中渲染Mako模板。 Django文档更详细地解释了这个过程,但基本上你必须解析标记的输入,确保参数有效,并从中创建一个django.template.Node对象。 Node是一个对象,它接受模板标记参数并定义render()方法来处理它们。但是,您必须特别小心,以逃避模板标记返回的文本,因为您绝对不希望转义HTML标记。显然,Django人员也考虑过这一点,同一个文档中有一个名为"Auto-escaping considerations"的部分解释了如何做到这一点。

一旦你弄清楚如何解析模板标签的输入(实际上只是验证参数),你可以定义Node.render()方法,用标签中给出的模板和上下文调用Mako的渲染函数,并将输出返回到Django模板。但是,当你使用'body'作为第二个参数时,我对你的描述感到有些困惑。相对于Mako模板,这意味着什么?我必须承认我从未使用过Mako,但是快速浏览文档可以看出与Django和Jinja2系统有许多相似之处;如果这个假设是错误的,我道歉。如果你可以通过Django模板标签文档,这似乎是一个合理的任务。祝你好运!