Django – #33 – Wbudowane tagi szablonów (Extends i Include)
Wprowadzenie.
Gdy projektujemy aplikację, często chcemy, aby była łatwo skalowalna, a zarazem czytelna. Django w tym celu dostarcza nam między innymi dwa tagi, którymi są extends oraz include. O tagu extends już trochę napisałem we wpisie Django – #7 – Pierwsza aplikacja – Rozszerzenia szablonów, lecz wydaje mi się, że temu zagadnieniu warto poświęcić jeszcze trochę uwagi oraz zestawić obydwa tagi razem demonstrując tym samym ich funkcjonalności.
Zakres artykułu.
- Wbudowane tagi szablonów (Extends i Include)
Wbudowane tagi szablonów (Extends i Include)
Jak już zaznaczyłem na wstępnie jeden, jak i drugi tag pozwalają uczynić naszą stronę łatwiej skalowalną. Tagi te mają za zadanie wstawianie kodu z jednego pliku do drugiego zgodnie z pewnymi zasadami.
Poniżej zamieściłem przykład, który demonstruje, kiedy możemy zastosować rozwiązanie z tagiem extends, a kiedy z tagiem include.
Na początek zajmę się tagiem extends. Jak możemy zobaczyć relacja ta, występuje między plikiem home.html (dziecko) oraz main.html (rodzic). W pliku main.html należy zamieścić tag {% block dowolna_nazwa_bloku %} {% endblock %}, natomiast w pliku home.html należy zamieścić koniecznie na początku pliku tag {% extends „main.html” %} a następnie w dowolnym miejscu tag {% block dowolna_nazwa_bloku %} tu_jest_nasz_kod {% endblock %}. Taka struktura powoduje, że w miejsce tagu z pliku rodzica, wstawiany jest kod z tagu z pliku dziecka. Ze względy na fakt, że bloki oznaczone są dowolną nazwą, mamy możliwość wprowadzenia wielu takich tagów.
Przejdźmy teraz do tagu include z punktu widzenia pliku home.html oraz navbar.html. Jak widzimy, tagu tego możemy użyć wielokrotnie. Tag ten zamieszczany jest tylko w jedym pliku, co oznacza, że drugi plik nie będzie zawierał informacji, że może być użyty. W naszym przypadku include zamieszczamy w pliku home.html. Mechanizm ten powoduje, że kod zamieszczony w pliku navbar.html zostanie umieszczony w miejsce tagu include {% include „finance/navbar.html” %}, znajdującego się w pliku home.html.
Żeby nie zajmować się tworzeniem projektu na nowo, wykorzystałem szkielet projektu ze wpisu Django – #13 – System Autoryzacji cz. 1, który następnie podzieliłem między wyżej wymienione pliki i w niektórych miejscach dokonałem lekkiej modyfikacji.
Kod pliku main.html.
W pliku tym, w miejsce zawartości między tagiem head, zamieściłem tag include, a usunięty kod przeniosłem do pliku head.html. Druga modyfikacja polegała na usunięciu kodu z tagu body wraz z tym tagiem.
Kod pliku head.html.
Kod ten jak już wspomniałem, został przeniesiony z tagu head pliku main.html.
Kod pliku home.html.
Kod ten w zasadzie ma za zadanie rozszerzeć szablon main.html, gdzie zawartość wszystkich tagów include ma zostać umieszczona w bloku o nazwie content z pliku main.html. W tym miejscu warto zwrócić uwagę na linijkę z kodem {% include „finance/home_content.html” with layout=v_layout name=”Hello” %}, gdzie zostały umieszczone argumenty layout oraz name, które przekazywane są do pliku home_content.html. W tym miejscu muszę zaznaczyć, że do argumentu layout została przypisana zmienna v_layout, która jak później zobaczymy, znajduje się w widoku funkcji renderującej plik home.html.
Tu widzimy kolejną zaletę tagów include, które pozwalają używać argumentów.
Kod pliku body_start.html.
W tym miejscu można byłoby się zastanowić, dlaczego nie zastosowałem tagu extend, lecz dzięki takiej konstrukcji i możliwości użycia argumentów w include, jestem w stanie w prosty sposób kontrolowa na przykład przypisane klasy stylów css tagu body.
Kod pliku body_end.html.
Kod pliku navbar.html.
Plik ten zawiera jedynie przeniesioną części kodu odpowiedzialną za generowanie paska nawigacji.
Kod pliku home_content.html.
Do tego pliku dodałem kod umieszczony w tagu h3. Kod ten wykorzystuje tagi if, elif, else oraz endif, które sterowane są przy pomocy przekazanego argumentu v_layout. Na podstawie wartości argumentu jesteśmy w stanie określać, który plik chcemy dołączyć do pliku home_content.html.
Kod plików home_content_layout1.html, home_content_layout2.html, home_content_layout3.html.
Kod ten ma nas tylko informować, który plik się załączył, dzięki czemu możemy sprawdzić, czy wartość, która była przekazana do parametru, została przekazana poprawnie.
Kod pliku views.py.
W tym pliku w słowniku context umieszczamy naszą wcześniej już wspominaną zmienną v_layout, która jest odpowiedzialna za sterowanie załączaniem odpowiedniego pliku home_content_layout1.html, home_content_layout2.html, home_content_layout3.html
Wpisanie w przeglądarkę adresu 127.0.0.1:8000, w takim przypadku, powinno spowodować pojawienie się następującej strony.
Zmodyfikujmy funkcję widoku home, gdzie teraz do zmiennej v_layout przypiszmy zmienną ’2’.
Taka modyfikacja spowoduje, że wpisanie tego samego adresu wygeneruje nam następującą stronę.
Wykonajmy jeszcze jeden test i do zmiennej v_layout wpiszmy wartość ’asd’.
W efekcie otrzymamy następującą stronę.