{{ nazwa_zmiennej }}
, bloki kodu oznaczamy tak {% instrukcje do wykonania %}
i mamy dostęp do filtrów (przy pomocy znaku |, to chyba najciekawszy element) wbudowanych i własnych. Dozwolone sa zarówno bloki kodu z instrukcjami warunkowymi if else endif
jak i pętlami for
(np. {% for category in categories %}
) Wszystkie te możliwości spróbuje sprawdzić i pokazać w najbliższym czasie.Kolejna ciekawostka, którą oferują szablony użyte w Django, to możliwość wygenerowania obiektu szablonu poprzez podanie łańcucha znaków zawierającego szablon (oprócz tego oczywiście jest możliwość podania ścieżki do pliku zawierającego szablon, ale to standard). Zaczynam klasyczne testy:
./manage.py shell
a potem: from django.template import Template
, potem t = Template("Jestem {{ nazwisko }}. {{imie}} {{nazwisko}}")
i print t
co spowoduje nam tylko wyświetlenie gdzie znajduje się obiekt t. Z tego co piszą w DB to szablony są prekompilowane do wewnętrznej formy, gotowej do wygenerowania strony. W związku z tym błąd w szablonie (np. t = Template('{% bledna instrukcja %} ')
), objawia się już w momencie powoływania obiektu szablonu do życia.Generowanie strony z szablonu odbywa sie w kontekście, który jest reprezentowany przez obiekt klasy
Context
. W poniższym kodzie krótka prezentacja (kod przeklejony bezpośrednio z konsoli, uznałem że ta forma prezentacji będzie lepsza, oczywiście wpisujemy to, co jest po dwukropku):
In [27]: from django.template import Context,Template
In [28]: t = Template("Jestem {{ nazwisko }}. {{imie}} {{nazwisko}}")
In [29]: c = Context({"nazwisko": "Blond", "imie": "James"})
In [30]: t.render(c)
Out[30]: 'Jestem Blond. James Blond'
Oczywiście warto sprawdzić, co się stanie, jak kontekst nie będzie miał zdefiniowanej jakiejś zmiennej:
In [33]: from django.template import Context,Template
In [34]: t = Template("Jestem {{ nazwisko }}.{{imie}}{{nazwisko}}")
In [35]: c = Context({"nazwisko": "Blond"})
In [36]: t.render(c)
Out[36]: 'Jestem Blond.Blond'
Jak widać, nic złego sie nie stało. Wygenerowany został pusty napis. Moim zdaniem, to plus (CakePHP generował, o ile dobrze pamiętam, błąd w takiej sytuacji). Projektant strony może więc ją spokojnie rozszerzać o nowe elementy odwołujące się do jeszcze nie zdefiniowanych zmiennych i nie czekać na programistę.
Ostatni element w tym wpisie to umożliwienie interaktywnego testowania wielolinijkowych szablonów (informacja przydatna dla tych co wcześniej nie korzystali z Pythona), wielolinijkowe łańcuchy znaków umieszczamy po prostu pomiędzy potrójnymi cudzysłowami
"""długi łańcuch"""
:
In [39]: from django.template import Context,Template
In [40]: t = Template("""Jestem {{ nazwisko }}.{{imie}}{{nazwisko}}
....: W najnowszym filmie bede mial {{liczbaZyc}} zyc
....: Co Ty na to""")
In [42]: c = Context({"nazwisko": "Blond", "imie": "James", "liczbaZyc": 5})
In [43]: t.render(c)
Out[43]: 'Jestem Blond.JamesBlond\nW najnowszym filmie bede mial 5 zyc\nCo Ty na to'
Przykłady zawierają powtórzenia (importy, ponowne definicje obiektów) wyłącznie dla pokazania pełnego obrazu tego co się dzieje w programie. W trakcie jednej sesji oczywiście nie ma potrzeby wielokrotnego importowania klas czy tworzenia tego samego szablonu.
Czwarty rozdział DjangoBook jest całkiem spory, więc jego zawartość rozciągnie się na kilka wpisów, w których sukcesywnie będę poszerzał informacje o szablonach.
Brak komentarzy:
Prześlij komentarz