2

我们很久以前就决定在我们的 Django 项目中使用 Mako 模板。我们还支持 Django 模板,因为许多可重用应用程序(显然)假设 Django 模板可用。我发现可以从 Mako 渲染 Django 模板,但我无法找到一种方法让它反过来工作。

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

我想我想要的是一个模板标签,它会调用 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 的项目非常有用。

4

1 回答 1

0

好问题!借助 Django 的自定义模板标签,可以在 Django 模板中渲染 Mako 模板。Django 文档更详细地解释了该过程,但基本上您必须解析标签的输入,确保参数有效,并django.template.Node从中创建一个对象。这Node是一个对象,它接受您的模板标签参数并定义render()处理它们的方法。但是,您必须特别注意转义模板标记返回的文本,因为您绝对不希望 HTML 标记被转义。显然 Django 的人也考虑过这一点,并且在同一个文档中有一个名为“自动转义注意事项”的部分解释了如何做到这一点。

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

于 2011-04-10T09:41:08.173 回答