2009-11-12 10 views

Odpowiedz

4

Korzystanie block.super działa poprawnie, gdy rozszerzenie szablonu, ale nie tak dobrze, gdy w tym jeden, czyli:

{% extends "base.html" %} vs. {% include "partial.html" %} 

Powiedzmy, że chcesz to szablon w środku twoja strona i chciałbyś dodać trochę javascriptu w bloku na końcu strony: wywołanie block.super w dołączonym szablonie spowoduje awarię.

Cf. Django wydaje #7324, #12008, #13399 i related update to the documentation. Cf. include tag uwaga:

include tag powinny być uważane za realizację „render to subtemplate i zawierać kod HTML”, a nie jako „przeanalizować ten subtemplate i to jego zawartość tak, jakby były częścią rodzica”. Oznacza to, że nie ma współdzielonego stanu między dołączonymi szablonami - każdy z nich zawiera całkowicie niezależny proces renderowania.

Bloki są oceniane przed ich dołączeniem. Oznacza to, że szablon zawierający bloki od innego zawiera bloki, które zostały już ocenione i renderowane - nie bloki, które można przesłonić, na przykład przez rozszerzający się szablon.

W tym przypadku polecam korzystania django-sekizai, wich pozwalają robić takie rzeczy jak:

{% load sekizai_tags %} 

           ⎧ <p>Some content</p> 
<p>Some content</p>    | {% addtoblock "js" %} 
           | <script type="text/javascript"> 
{% include "partial.html" %} -> ⎨  alert("Hello django-sekizai"); 
           | </script> 
<p>Some more content</p>  ⎩ {% endaddtoblock %} 


{% render_block "js" %} 

Od django-sekizai README:

Głównym powodem zacząłem ten projekt był brak dobrej struktury mediów (css/js) w django i django-cms. Tak, istnieje klasa Media używana w formularzach w django, ale tak naprawdę to nie działa tak dobrze. Zwykle faceci z frontendu chcą zdecydować się na pliki css i javascript, które mają być dołączone i nie chcą edytować plików w Pythonie, aby zmienić, ani nie chcę, aby zmieniły moje pliki Pythona. W związku z tym istnieje potrzeba umożliwienia edycji zawartości szablonów, które są przed lub po punkcie, w którym się znajdujesz. Chciałem też usunąć duplikaty. W rezultacie napisałem django-sekizai, który robi dokładnie to. Jest podobny do bloków, tylko zamiast je dziedziczyć, rozszerzasz je.

Powiązane problemy