14 sierpnia 2007

Zaczynam z Django 6 - prawdziwa strona II

Kolejną właściwością szablonów jest dostęp do elementów słowników, obiektów i tablic. Większości wyda się to oczywiste, ale warto o tym wspomnieć.

Słownik:



In [15]: from django.template import Context,Template
In [16]: t = Template("""Jestem {{ osoba.nazwisko }}. {{osoba.imie}} {{osoba.nazwisko}}
....: W najnowszym filmie bede mial {{osoba.liczbaZyc}} zyc""")
In [18]: james = {'imie': 'James', 'nazwisko': 'Blond', 'liczbaZyc': '5'}
In [19]: c = Context({'osoba': james})
In [20]: t.render(c)
Out[20]: 'Jestem Blond. James Blond\nW najnowszym filmie bede mial 5 zyc'



Obiekt (oczywiście do obiektów własnych klas odwołujemy się tak samo):



In [24]: from django.template import Context,Template
In [25]: import datetime
In [26]: d = datetime.date(2007, 7, 14)
In [27]: d.month
Out[27]: 7
In [28]: t = Template('Miesiac {{ date.month }} roku Panskiego {{ date.year }}.')
In [29]: c = Context({'date': d})
In [30]: t.render(c)
Out[30]: 'Miesiac 7 roku Panskiego 2007.'
In [31]: c = Context({'date': datetime.date(2007, 6, 14)})
In [32]: t.render(c)
Out[32]: 'Miesiac 6 roku Panskiego 2007.'



Elementy tablicy (i wywołanie metody upper - można wołać metody, ale tylko bezparametrowe, jak najbardziej można używać kropki wielokrotnie, nie używa się nawiasów przy wywołaniu ):



In [48]: from django.template import Template, Context
In [49]: t = Template('Teraz prezentujemy agenta o numerze dwa: {{ agenci.2.upper }}.')
In [50]: t.render(Context({'agenci': ['James', 'Bolo', 'Olo']}))
Out[50]: 'Teraz prezentujemy agenta o numerze dwa: OLO.'



Jak na warstwę prezentacji, wymienione elementy to naprawdę sporo. W przypadku gdyby ktoś bał się, że mu wystąpi konflikt nazw, kolejność szukania elementu po kropce jest następująca (dla a.b): klucz w słowniku (a["b"]), atrybut obiektu (a.b), wywołanie metody(a.b()), odwołanie do tablicy (a[b]).
Jeszcze słówko o obsłudze wyjątków w metodach. Można spowodować, żeby wyjątek był zignorowany (oczywiście nie jest to dobry sposób obsługi każdego wyjątku). W szablonach Django dzieje się tak wtedy, kiedy obiekt wyjątku ma ustawioną specjalną zmienną: silent_variable_failure = True
Można także zabezpieczyć się przed wywołaniem metody (na przykład takiej, która ma efekty uboczne):



def zapis(self):
zapis.alters_data = True



Kolejnym istotnym elementem jest zachowanie szablonów w momencie odwołania się do nieistniejącej zmiennej. Jeżeli nie zostanie zmieniona konfiguracja Django, to błędne odwołania są ignorowane (pusty string). Warto o tym pamiętać, choćby ze względu na rozróżnianie wielkości liter.

Brak komentarzy: