2013-01-04 62 views
14

我有一個艱難的時間,試圖延長/包括模板Django的模板引擎壓痕

這些文件時獲得Django的模板引擎縮進正確:

index.html

<html> 
    <body> 
     <div id="hello"> 
      {% block bar %} 
      {% endblock %} 

      {% include 'baz.html'%} 
     </div> 
    </body> 
</html> 

bar.html

{% extends 'foo.html' %} 

{% block bar %} 
<p>bar</p> 
{% endblock %} 

baz.html

<p>baz</p> 

將呈現爲

<html> 
    <body> 
     <div id="hello"> 
<p>bar</p> 
<p>baz</p> 
     </div> 
    </body> 
</html> 

如何解決它,所以它呈現爲

<html> 
    <body> 
     <div id="hello"> 
      <p>bar</p> 
      <p>baz</p> 
     </div> 
    </body> 
</html> 

手動輸入標籤是不是一種選擇。 如果有這個問題,我正在使用軟標籤(4個空格)。

+4

我不知道爲什麼會這麼重要。無論如何,瀏覽器都會忽略縮進,唯一的原因是讓文本編輯器更容易閱讀 - 而且無論如何你永遠都不會看到完整的渲染頁面。 –

回答

6

縮進不會被Django模板繼承自動插入。爲了實現縮進你的願望,你就需要內bar.html包括它:

{% extends 'foo.html' %} 

{% block bar %} 
      <p>bar</p> 
{% endblock %} 
+0

真的沒有其他辦法嗎? 我將以6級縮進文件結束.. – rxdazn

+0

真的。你必須編寫自己的'{%block%}'標籤。 –

2

您應該說明的是你的壓痕需求的目的。

縮進在調試步驟中非常有用,但縮進與優化不兼容,因爲這存在spaceless過濾器。

您可以編寫自己的文檔片斷:

@register.tag 
def myinden(parser, token): 
    args = token.contents.split() 
    n = args[1] 
    nodelist = parser.parse(('endmyinden',)) 
    parser.delete_first_token() 
    return MyIndenNode(nodelist, n) 

class MyIndenNode(Node, n): 
    def __init__(self, nodelist, n): 
     self.nodelist = nodelist 
     self.n = n 

    def render(self, context): 
     import re 
     regex = re.compile("^", re.M) 
     return re.sub(regex, "\t"*int(self.n), 
         self.nodelist.render(context).strip()) 

要用法:

index.html 
{% include 'baz.html' with indentation="8" %} 

baz.html 
{{ myindent:myindentation }} 
... 

通知,未經測試。另外,我建議你修改snippet只能在調試模式下工作:

+0

這隻適用於我自己,真的。我不喜歡有這樣的文件https://gist.github。com/3c73384133e553ad6567 如果我不得不面對這樣的文件,我會想知道爲什麼起初有這麼多的空間。 – rxdazn

1

從上述提到的另一種選擇是使用美麗的湯中間件。

這是tutorial。請注意,人們稱這個中間件爲「REALLY SLOW」,並建議緩存輸出頁面。