2013-01-04 22 views
14

Sto avendo un momento difficile cercando di ottenere motore di template di Django per far rientrare correttamente quando si estende/inclusi i modelliDjango template engine rientro

questi file:

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> 

renderà come

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

Come posso risolvere il problema in modo che rende come

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

schede che entrano manualmente non è un'opzione. Sto usando le schede morbide (4 spazi), se mai questo è importante.

+4

Non sono sicuro del perché sarebbe importante. I browser ignorano comunque il rientro, l'unica ragione è quella di rendere più semplice la lettura nel tuo editor di testo - e in ogni caso non vedrai mai la pagina completamente renderizzata. –

risposta

6

Il rientro non viene inserito automaticamente dall'ereditarietà del modello Django. Per ottenere il rientro desiderato avresti bisogno di includerlo all'interno bar.html:

{% extends 'foo.html' %} 

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

Non c'è davvero altro modo? Finirò con file con 6 livelli di indentazione .. – rxdazn

+0

Davvero. Dovresti scrivere il tuo tag '{% block%}'. –

2

Si dovrebbe spiegare con le è lo scopo delle vostre esigenze di rientro.

L'indentazione è molto utile in fase di debug, ma il rientro non è compatibile con l'ottimizzazione, poiché esiste il filtro spaceless.

È possibile scrivere il proprio stato tagliato:

@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()) 

all'uso:

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

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

Avviso, non testato. Inoltre, ti suggerisco di modificare lo snippet per funzionare solo in modalità di debug:

+0

È solo per me stesso, davvero. Non mi piace avere file come questo https: //gist.github.it/3c73384133e553ad6567 Se dovessi affrontare un file come questo, mi chiedo perché ci siano così tanti spazi in un primo momento. – rxdazn

1

Un'altra opzione da quanto sopra citato è quello di utilizzare Beautiful Soup middleware.

Ecco uno tutorial. Nota che le persone chiamano questo middleware come "REALLY SLOW" e consiglio di memorizzare le pagine di output.