16 czerwca 2007

Najnowsze Django w Ubuntu

Dzisiaj pojawiło się nowe Django w Ubuntu (7.04, Feisty Fawn) - Version 0.96-1, czyli zgodnie z aktualnie wydaną wersją. Miło, bo oszczędzi to kilku problemów (jak np. ten opisany przeze mnie z krótkimi URL-ami). Pozwoli to też wzorować się dokładniej na DjangoBook.

09 czerwca 2007

Wracam na niusy

Postanowiłem zacząć znowu czytać niusy, oczywiście RSS dalej traktując jako podstawowe źródło informacji. Ale przeprosiłem się Usenetem i starym dobrym NNTP. Zachęcił mnie do tego występ Michała Rutkowskiego w telewizorni, przypomniałem sobie jak kiedyś na łamach pl.rec.sport.koszykowka dyskutowaliśmy np. o Timie Duncanie, o którym zresztą MR wczoraj sporo mówił. I od razu włączyłem tina (best ever NNTP reader) i uporządkowałem listę grup. Na razie tylko python, donosy i koszykówka. I już przyniosło to efekty, znalazłem ciekawy link: Zestaw filmów o Pythonie, między innymi Django (tylko instalacja). Jest też kilka innych interesujących kategorii.

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.