2013-01-04 10 views
14

Mam twardy czas próbuje szablonu silnik Django wcięcia poprawnie przy przedłużaniu/w tym szablonówDjango silnik szablon wcięcie

tych plikach:

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> 

odda jak

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

Jak mogę to naprawić, tak jak to czyni

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

ręcznego wprowadzania kart nie jest rozwiązaniem. Używam miękkich kart (4 spacje), jeśli to kiedykolwiek ma znaczenie.

+4

Nie jestem pewien, dlaczego miałoby to znaczenie. Przeglądarki i tak ignorują wcięcia, jedynym powodem jest ułatwienie czytania w edytorze tekstu - i tam nigdy nie zobaczysz pełnej renderowanej strony. –

Odpowiedz

6

Wcięcie nie jest automatycznie wstawiane przez dziedziczenie szablonów Django. Aby osiągnąć wcięcie chec trzeba by umieścić go wewnątrz bar.html:

{% extends 'foo.html' %} 

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

Czy naprawdę nie ma innego sposobu? Kończę z plikami o 6 poziomach wcięcia. – rxdazn

+0

Naprawdę. Musiałbyś napisać własny tag '{% block%}'. –

2

Należy wyjaśnić, ze jest cel Twoich potrzeb wcięć.

Wcięcie jest bardzo przydatne w etapie debugowania, ale wcięcie nie jest zgodne z optymalizacją, ponieważ istnieje filtr spaceless.

Możesz napisać własną snipped:

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

zwyczaje:

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

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

wypowiedzenia, nie testowane. Sugeruję również zmodyfikowanie fragmentu kodu tak, aby działał tylko w trybie debugowania:

+0

To tylko dla mnie, naprawdę. Nie lubię takich plików jak ten https: //gist.github.com/3c73384133e553ad6567 Gdybym musiał zmierzyć się z takim plikiem, zastanawiałbym się, dlaczego na początku jest tak dużo miejsca. – rxdazn

1

Inną opcją z wymienionych powyżej jest wykorzystanie Piękne Soup middleware.

Oto tutorial. Zauważ, że ludzie nazywają to oprogramowanie pośredniczące "REALLY SLOW" i doradzają buforowanie stron wyjściowych.