Serwis Riklaunima zna chyba każdy, kto próbował szukać w polskim internecie informacji o programowaniu dla www. Ostatnio Autor ten opublikował piękny snippet, którego mi bardzo w Django brakowało, pozwalający walidować formularze za pomocą captchy, czyli przepisywania tekstów z obrazków.
Znów straciłem wiele godzin w poszukiwaniu błędu, opiszę ten przykład, bo jest pouczający. Robiłem program partnerski do pewnego przedsięwzięcia. Jak to w tego typu programach bywa, trzeba było pobrać pewien kod z formularza i go zwalidować.
Dwa dni nad tym straciłem.
Było
return render_to_response('katalog/szablon.html', {'zmienna', zmienna})
return render_to_response('katalog/szablon.html', {'zmienna': zmienna})
Sposób używania tzw. procesorów kontekstu w Django jest niestety niezbyt intuicyjny. Zacznijmy jednak od omówienia czym jest kontekst i procesor kontekstu w Django.
Jak wiadomo, Django oddziela warstwę prezentacji od logiki oprogramowania (oraz od danych).
Przypuśćmy, że mamy listę książek, przechowywaną w obiekcie books
.
Tym razem nie piszę swojego tekstu, ale polecam świetny artykuł: http://www.tynecki.pl/?p=867#more-867
Przypuśćmy, że projektujemy prosty blog, w którym do każdego wpisu mogą być dołączane pliki rozmaitego typu (np. pdf, odt, jpg). Automatyczne wyszczególnienie wszystkich załączników pod wpisem (tak jak robi się to w mailach) jest w Django niezwykle proste i naturalne.
Coraz częściej przygotowujemy serwisy, które z założenia mają byc dostepne w różnych językach.
Ostatnio pisałem przy okazji pewnego projektu instrukcję prostej "internacjonalizacji". Oto ona:
Krok 1
W pliku settings.py należy upewnić się, że USE_I18N jest ustawione na True (tak jest domyślnie)
Następnie należy dodać klasę LocaleMiddleware do MIDDLEWARE_CLASSES, np.:
MIDDLEWARE_CLASSES = ( "Django.middleware.common.CommonMiddleware", "Django.contrib.sessions.middleware.SessionMiddleware", "Django.contrib.auth.middleware.AuthenticationMiddleware",
Czasem konieczne jest wyświetlenie kto jest zalogowany. Oto króciutki procesor kontekstu dla Django, który to umożliwia:
from django.contrib.sessions.models import Session from django.contrib.auth.models import User as StandardUser def whoisloggedin(request): sessions = Session.objects.all() ids = [session.get_decoded().get('_auth_user_id') for session in sessions] logged_in = StandardUser.objects.filter(id__in=ids) return {'logged_in':logged_in}
Jak wiemy, współczesne frameworki webowe, takie jak Django czy (w jeszcze większym stopniu) Ruby on Rails, opierają się na konwencjach nazewniczych. Konwencje te ułatwiają życie programiście. Na przykład w Django tworzy się klasę (model) ORM, w której to klasie nazwy pól odpowiadają nazwom kolumn w tabeli bazy danych.
Tabelę tworzy sobie Django automagicznie właśnie na podstawie zdefiniowanej klasy modelu. Na przykład:
class Product(models.Model): price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='cena')
Jeszcze nie przekonałeś się do Django? To wyobraź sobie, że przejąłeś słabo udokumentowany projekt internetowy po autorze i masz go ulepszać. Chcesz zmienić jakiś szczegół, np. napis.
Musisz dojść do tego skąd on się wziął. Który plik, który moduł w projekcie zawiera funkcję, która ten napis wygenerowała? Uwielbiasz to, prawda? Co to za męka, co za dramat... mówiąc słowami Tuwima!