2011-03-16 17 views
2

我们在很久以前就决定在我们的Django项目中使用Mako模板。我们也支持Django模板,因为很多可重用的应用程序(显然)都假定Django模板可用。我发现可以从Mako渲染Django模板,但是我一直无法找到一种方法让它以相反的方式工作。我怎样才能得到一个Django模板呈现在一个Mako模板中?

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

我想我想要的是一个模板标签,它会向Mako发出请求并要求'嵌入'。

我们真子模板所有正在执行以下操作:

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

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

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

随着`鲭以下/base.html':

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

    ${next.body()} 

    </body> 
</html> 

有没有人有过这样做?我对写模板标签不是很熟悉。你认为这可以做到吗?另一种方法可能是重写所有Mako中的模板,这根本不会吸引我。模板标签对于我认为使用Mako的很多项目来说是非常有用的。

回答

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模板标签文档,这似乎是一个合理的承诺。祝你好运!

+0

感谢您的回复。 Jinja和Mako有点类似,我相信。我所指的body参数是Mako模板中的函数调用。在Mako中,这只意味着'渲染派生模板主体'。我想我需要再看看Mako,看看是否可以使用python函数调用来提供文本块(html)以及用作基础的模板。我暂时把这件事搁置一旁,但如果我能做到这一点,我会在这里发布一个答案。欢呼输入。 – 2011-04-10 11:17:34

+0

@JoshSmeaton,谢谢你的澄清。我认为你正在寻找的功能是['mako.template.Template'](http://www.makotemplates.org/docs/usage。html#basic-usage),它将模板作为参数并返回一个'Template'对象。这个对象有一个'render()'方法,用给定的上下文参数呈现模板。我现在唯一关心的是在模板被渲染时,'body()'函数是否默认执行。如果我得到一个工作示例,我会在我的答案中发布代码。 – 2011-04-10 19:50:34

+0

编辑:我意识到编辑太迟,我没有你的Mako模板继承结构的知识,所以我不能真正复制$ {next.body}的行为。 – 2011-04-10 21:19:20

相关问题