
Papierowa dokumentacja TSL zastąpiona aplikacją z e-podpisem
Klient: Green Transit
Branża: Logistyka / LogTech
Template tags to świetne narzędzie pozwalające na manipulację danymi z poziomu template'ów w aplikacjach opartych o framework Django. Dużo z nich jest już wbudowanych we framework i gotowych do użytku, jednak czasem potrzebna jest customowa funkcjonalność.
CEO
13 lip 2023
Podstawowe template tagi dostępne w Django to np. autoescape, który przeciwdziała traktowaniu wartości typu string jako elementów HTML, czy comment, który sprawia, że napisana część template'u jest ignorowana. Mamy też takie funkcje jak lower, safe, if, for. Pierwsze co rzuca się w oczy to prostota tych funkcjonalności. I właśnie na to powinniśmy uważać. Zamysł template tagów zawiera w sobie prostotę działania - template nie powinien zawierać zbyt skomplikowanej logiki - za dostarczenie odpowiedniego kontekstu odpowiedzialny jest widok sam w sobie, template jest jedynie warstwą wizualną.

Klient: Green Transit
Branża: Logistyka / LogTech

Klient: PolandBuild
Branża: Budownictwo / ConTech

Klient: Klient (Aplikacja webowa do nauki programowania)
Branża: Edukacja / EdTech
To akurat bardzo proste. Załóżmy że chcemy dokonać konkatenacji dwóch wartości w sposób, który będzie godny zaufania. Django posiada tag pod nazwą add, jednak używanie go w ten sposób jest ryzykowne, ponieważ framework NAJPIERW spróbuje potraktować wartości jako liczby (cast na int), a dopiero PÓŹNIEJ jako stringi.
Tagi definiujemy jako pythonowe funkcje z argumentami zależnymi od typu tagu. Rejestrujemy je odpowiednim dekoratorem zaimportowanym z Django, a następnie definiujemy co mają zwracać. Wszystko zachodzi w pliku o dowolnej nazwie zawartym w folderze templatetags naszej aplikacji. Generyczny przykład wygląda tak:
from django import template
register = template.Library()
@register.<typ tagu>(<...opcje>)
def <nazwa tagu>(<...argumenty>):
<...operacje>
return <zwracana wartosc>
Mamy kilka typów tagów: filtry, simple tagi i inclusion tagi. Każdy z nich służy do czegoś innego. Filtry służą do dokonywania operacji na wartościach, definiujemy je tak:
@register.filter
def example_filter(value):
return f"{value} with filter applied"
Ten tag zwraca wartość z dopiskiem "with filter applied". Oczywiście tylko od nas zależy co taka funkcja zwróci. Wewnątrz template'u składnia będzie taka:
{% load <nazwa pliku z naszym tagiem> %}
{{ some_value|example_filter }}
Mamy też simple tag, który dokonuje operacji na wielu przekazanych wartościach i zwraca wynik, wygląda to tak:
@register.simple_tag(takes_context=<bool>)
def example_simple_tag(*args):
return sum(args)
Opcja takes_context umożliwia przekazanie kontekstu template'u jako pierwszy argument. W tym przykładzie tag przyjmuje nieograniczoną ilość argumentów nienazwanych i zwraca ich sumę. Przykład użycia:
{% load <nazwa pliku z tagiem> %}
{% example_simple_tag 46 11 5 39 %}
Następnym typem tagu jest inclusion tag. Służy on do injectowania sub-template'ów z plików, przekazując im różne dane. Służy on do zbudowania struktury modułowej naszych widoków, aby uniknąć powtarzania kodu, w myśl zasady DRY. Tworzymy go tak:
@register.inclusion_tag("<nazwa pliku>.html")
def example_inclusion_tag(data):
return {
"some_data": data
}
W tym przypadku przyjmujemy jeden argument i przekazujemy go templateo'wi z podanego pliku w kontekście pod nazwą "some_data". Skutkiem tego w naszym template <nazwa pliku>.html jesteśmy w stanie dostać się do podanej wartości używając {{ some_data }}. Użycie tego tagu wygląda w ten sposób:
{% load <nazwa pliku z tagiem> %}
{% example_inclusion_tag data=5 %}
To są podstawy podstaw customowych template tagów w Django. Zawsze warto zajrzeć do dokumentacji frameworka aby uzyskać więcej informacji. Template tagi to świetne narzędzia, dające dużą wygodę developerom piszącym template'y.
FAQ
Tagi szablonów Django to specjalna składnia do wykonywania logiki w szablonach HTML. Framework dostarcza tagi wbudowane — if, for, url, block, include — a deweloperzy mogą dopisywać własne tagi i filtry dla logiki specyficznej projektu: komponentów wielokrotnego użytku (panele boczne, nawigacja), formatowania danych (polska waluta, polskie daty) czy integracji z usługami zewnętrznymi. System szablonów Django jest celowo bardziej restrykcyjny niż Jinja2 znana z Flaska — mniej swobody w szablonie oznacza logikę tam, gdzie jej miejsce: w widokach i serwisach.
Rodzaje własnych rozszerzeń:
W polskich projektach Django własne tagi najczęściej obsługują rodzime formatowanie: daty, złotówki, kody pocztowe, NIP-y.
Implementacja filtra krok po kroku: w aplikacji tworzy się pakiet templatetags (koniecznie z __init__.py), w nim moduł, np. polskie_tagi.py, a w module rejestr i funkcję: register = template.Library(), dekorator @register.filter nad funkcją przyjmującą wartość i zwracającą sformatowany wynik — na przykład kwotę w formacie „1 234,56 PLN". W szablonie najpierw {% load polskie_tagi %}, potem {{ cena|polska_waluta }}. Filtry przyjmują najwyżej jeden argument poza wartością — do wielu argumentów służą simple tags. Dobra praktyka: filtry małe i jednozadaniowe.
Implementacja tagów: simple tag to dekorator @register.simple_tag (opcjonalnie z takes_context=True, gdy potrzebny dostęp do kontekstu szablonu); inclusion tag — @register.inclusion_tag('moj_widzet.html') z funkcją zwracającą kontekst dla wskazanego fragmentu. Praktyczny przykład: tag {% polski_adres user.address %} renderujący adres według rodzimych konwencji — ulica, kod XX-XXX, miasto. Reguła wyboru: inclusion tags dla powtarzalnych elementów interfejsu (okruszki, nawigacja, karty), simple tags dla logiki i obliczeń. Warto zbudować współdzieloną bibliotekę polskich formatów używaną we wszystkich projektach organizacji.
Pułapki:
Blog
Global Interpreter Lock (GIL) to mechanizm, który wpływa na sposób, w jaki Python wykonuje kod. Mimo że ma za zadanie kontrolować dostęp do zasobów pamięci, jego obecność może wpływać na skomplikowane scenariusze wielowątkowe. Pozwólmy sobie przyjrzeć się bliżej temu zagadnieniu.
Model-View-Controller (MVC) to architektura, która wywarła istotny wpływ na rozwój systemów internetowych. Ten wzorzec projektowy, zapewniający klarowność i porządek w kodzie, pozostaje niezmiernie popularny. Jego sekrety, zalety i zastosowania będą przedmiotem naszej dyskusji. Zanurzmy się w świat MVC, odkrywając tajniki tej sprawdzonej metody.
ORM (Object-Relational Mapping) to narzędzie, które znacząco ułatwia pracę z relacyjnymi bazami danych. Django, jako zaawansowany framework Pythona, posiada wbudowany ORM umożliwiający skuteczne zarządzanie danymi. W niniejszym artykule omówimy podstawy wykorzystania Django ORM, zwracając szczególną uwagę na efektywne zarządzanie relacjami w bazach danych.
MERN Stack to jeden z najpopularniejszych zestawów technologii wykorzystywanych do tworzenia nowoczesnych aplikacji webowych. Dzięki połączeniu MongoDB, Express, React oraz Node.js umożliwia on budowę wydajnych i skalowalnych rozwiązań opartych w całości na języku JavaScript. Stack ten jest chętnie wybierany zarówno przez startupy, jak i doświadczone zespoły developerskie.
Utrzymanie spójnego stylu i wysokiej jakości kodu to jedno z największych wyzwań w nowoczesnych projektach programistycznych. Wraz z rozwojem ekosystemu JavaScript i TypeScript deweloperzy coraz częściej muszą korzystać z wielu narzędzi do formatowania i lintowania, co prowadzi do złożonej konfiguracji i potencjalnych konfliktów. Biome powstało jako odpowiedź na te problemy, oferując jedno, szybkie i spójne rozwiązanie typu all-in-one.
Bazel to jedno z najszybszych i najbardziej niezawodnych narzędzi do budowania projektów, stworzone z myślą o pracy na dużą skalę. Dzięki inteligentnemu zarządzaniu zależnościami i zaawansowanym mechanizmom cache’owania znacząco skraca czas kompilacji, nawet w bardzo rozbudowanych repozytoriach. Pozwala zespołom pracować szybciej, stabilniej i bardziej przewidywalnie, niezależnie od stosowanych języków programowania.