Odpowiedzi:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
Używanie block.super
działa dobrze przy rozszerzaniu szablonu, ale nie tak dobrze, gdy jest dołączany, np .:
{% extends "base.html" %} vs. {% include "partial.html" %}
Załóżmy, że chcesz umieścić szablon na środku strony, a także chcesz dodać trochę javascript w bloku na końcu strony: wywołanie block.super
dołączonego szablonu spowoduje awarię.
Por. Django wydaje # 7324 , # 12008 , # 13399 i powiązaną aktualizację dokumentacji . Por. Uwzględnij tag uwaga:
Znacznik include powinien być traktowany jako implementacja „wyrenderuj ten szablon podrzędny i dołącz kod HTML”, a nie „przeanalizuj ten szablon podrzędny i dołącz jego zawartość, jakby była częścią elementu nadrzędnego”. Oznacza to, że nie ma współdzielonego stanu między dołączonymi szablonami - każdy dołączenie jest całkowicie niezależnym procesem renderowania.
Bloki są oceniane przed ich dołączeniem. Oznacza to, że szablon, który zawiera bloki z innego, będzie zawierał bloki, które zostały już ocenione i wyrenderowane - a nie bloki, które można przesłonić, na przykład rozszerzającym szablonem.
W takim przypadku polecam użycie django-sekizai , które pozwolą ci na 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" %}
Z pliku README django-sekizai :
Głównym powodem, dla którego zacząłem ten projekt, był brak dobrego frameworka dla mediów (css / js) w django i django-cms. Tak, jest klasa Media używana w formularzach w django, ale tak naprawdę to nie działa tak dobrze. Zwykle faceci od frontendu chcą decydować o dołączeniu plików css i javascript i nie chcą edytować plików Pythona, aby zmienić, a ja też nie chciałem, żeby zmieniali moje pliki Pythona. Dlatego zaistniała potrzeba umożliwienia edycji zawartości szablonów, które znajdują się przed lub po miejscu, w którym się znajdujesz. Chciałem też usunąć duplikaty. W rezultacie napisałem django-sekizai, które dokładnie to robi. Jest podobny do bloków, tylko zamiast je dziedziczyć, wydłużasz je.