2011-03-16 46 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

相關問題