django

ReCaptcha by Riklaunim

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.

Jeszcze o błędach

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ć.

Najgłupszy błąd świata

Dwa dni nad tym straciłem.
Było

return render_to_response('katalog/szablon.html', {'zmienna', zmienna})

Powinno być oczywiście
return render_to_response('katalog/szablon.html', {'zmienna': zmienna})

Czyli ":" zamiast ",". Interpreter nie wywalał błędu składniowego... A ja głupi, nie mogłem znaleźć :(

Procesory kontekstu

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.

Integracja Django i TinyMCE

Tym razem nie piszę swojego tekstu, ale polecam świetny artykuł: http://www.tynecki.pl/?p=867#more-867

Odwrotna strona relacji

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.

Wielojęzyczny interfejs w Django

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",

Wyświetlenie zalogowanych użytkowników

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}

Ucieczka z niewoli konwencji

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 jeden powód by kochać Django

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!

Subskrybuje zawartość