02 czerwca 2007

Zaczynam z Django 5 - prawdziwa strona

W kolejnym podejściu chcę generować "prawdziwe" strony. Teraz trzeba już wykorzystać system szablonów oferowanych przez Django. W końcu po to on jest. Po to jest on. Z lektury czwartego rozdziału DB dowiedziałem się, że w szablonach: dostęp do zmiennych uzyskuje się poprzez napisanie {{ 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: