Czy możemy dołączyć do {% block%} zamiast nadpisywać?

116

W moim core.html mam blok oznaczony javascript. Byłoby wspaniale, gdybym mógł dodać więcej wierszy do tego bloku bez nadpisywania wszystkiego w nim.

PKKid
źródło

Odpowiedzi:

9

Używanie block.superdział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.superdołą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.

Maxime R.
źródło