Open Source

Społeczność

Ta strona, odświeżana co godzinę, zbiera wpisy z blogów na tematy związane z Django

Django, polskie znaki i Postgres

Posted on Grudzień 6, 2010 at 8:38 po południu by Natcam RSS

Ostatnio parę ładnych godzin spędziłem debugując dziwny problem zaobserwowany w pewnej aplikacji. Otóż aplikacja ta działała bez problemu w środowisku deweloperskim, natomiast w środowisku testowym pola autocomplete (ajax) nie chciały znajdować użytkowników… Całość używała mniej więcej czegoś takiego MojModel.objects.filter(first_name__istartswith='Jaś') Wstępnie udało mi się stwierdzić, iż problem dotyczył tylko użytkowników z polskimi literkami w nazwiskach/imionach. Gorzej, że czasami to jednak działało, np. dla ‘Ścierski’ wyniki były OK, ale już dla ‘Ścieżkowski’ nie. Zapoznałem się wiec z wewnętrzną implementacją istartswith, icontains w Django i okazało się że zapytanie SQL, które nie jest CaseSensitive, Django realizuje przy pomocy UPPER, np: select * from tabela where UPPER(KOLUMNA)=UPPER('Jaś'); Szybki test na środowisku testowym i… efekt jak poniżej: UPPER('zażółć gęślą jaźń') --- ZAżółć GęśLą JAźń z kolei dla dużych liter było ok: UPPER('ŻĄdło') ---- ŻĄDłO co wyjaśniało dlaczego czasem filtrowanie działało (jeśli polska literka była pierwszą w nazwisku, a więc była wpisana od razu jako duża). Po szybkim przeglądzie opcji konfiguracyjnych postgresa i konfiguracji serwera udało mi się stwierdzić, że serwer na którym było uruchomione środowisko testowe (pewnie zainstalowany kiedyś pod kątem PHP), używał kodowania iso-8859-2 wraz z locale pl_PL. Tymczasem moja aplikacja na Django była przystosowana do użycia UTF-8 i wykorzystywana przez nią baza danych ...

Przeczytaj cały wpis »

Proste testowanie formularzy w Django

Posted on Listopad 18, 2010 at 8:55 po południu by Natcam RSS

Django posiada wbudowane mechanizmy umożliwiające tworzenie testów. Jednym z elementów Django’wego TestCase jest klasa Client umożliwiająca zasymulowanie przeglądarki z poziomu kodu naszego testu. Przykładowe użycie tej klasy wygląda tak: from django.test.client import Client c = Client() response = c.post('/login/', {'username': 'john', 'password': 'smith'}) Super… ale czy na pewno? Ostatnio natrafiłem na dość uciążliwe w testowaniu (za pomocą wbudowanego mechanizmu) formularze. Standardowy Client wymaga bowiem przesłania w słowniku wszystkich wartości, które powinny znaleźć się w żądaniu POST. W przypadku, np. formsetów zmusza to nas do wypełnienia normalnie niewidocznych (hidden) pól z ManagementForm. Podobnie, a czasem nawet gorzej, jest w przypadku formularza edycji jakiegoś obiektu. Powiedzmy że chcemy zmienić np. tylko jedno pole w formularzu, który ma w sumie tych pól 20. Niestety, musimy w wywołaniu client.post wstawić wartości dla wszystkich tych pól. Bardzo uciążliwe… Jest jednak świetne rozwiązanie tego problemu: django-webtest. Pozwala on na np. wejście na stronę edycji obiektu (przez GET), wypełnienie pola, np. ‘nazwa’ w formularzu i wykonanie operacji ‘submit’, np. tak: my_form = self.app.get(reverse('mypage')).form form['nazwa'] = 'foo' response = form.submit().follow() self.assertEqual(response.context['user'].username, 'foo') Wszystkie pozostałe pola formularza (łącznie z tokenem csrf) zostaną wysłane i ‘automagicznie’ wypełnione. I to jest to! Przy okazji polecam przyjrzeć się innym projektom autora django-webtest, ...

Przeczytaj cały wpis »

Wszystko dla Django

Posted on Listopad 10, 2010 at 8:23 po południu by restlessbeing RSS

Dawno dawno temu była sobie całkiem przyjemna strona Django Pluggables, na której można było znaleźć liczne aplikacje do wykorzystania we własnych projektach. Poźniej, jak pamiętam, pojawił się na liście dyskusyjnej Django wątek, w którym dyskutowano o tym, że tych aplikacji jest tak dużo, że nie wiadomo którą wybrać. Jak się wczoraj dowiedziałem na dyskusji się nie skończyło i oto Django Pluggables zamieniło się w Django Packages. Django Packages to rewelacyjna strona. Po pierwsze znajdziemy na niej nie tylko uniwersalne aplikacje (wolne tłumaczenie angielskiego reusable apps), ale też frameworki, czyli np. CMSy, fora, czy sklepy internetowe, a także gotowe projekty oparte na Django oraz "inne", czyli to co nie łapie się do powyższych kategorii, ale jest przydatne jak np. buildoutowa recepta djangorecipe. Po drugie wszystkie zamieszczone na stronie pakiety mają przypisane parametry pozwalające nam na ocenę ich popularności. Wśród parametrów tych znajdziemy: ilość pobrań ze strony pypi, aktywnośc w repozytorium projektu oraz ilość użytkowników. Po trzecie Django Packages to gridy. Absolutnie przydatne zestawienia porównawcze. Co tu dużo pisać to trzeba zobaczyć, oto przykładowy grid dla CMSów. Oczywiście każdy odwiedzający, po zarejestrowaniu, może dodać do strony nową aplikację, stworzyć nowy grid, lub zmodyfikować istniejące. Każdy może też kliknąć "I use it" przy ...

Przeczytaj cały wpis »

Wszystko dla Django

Posted on Listopad 10, 2010 at 8:23 po południu by restlessbeing RSS

Jak mogłem to przegapić? Obowiązkowa strona dla użytkowników Django: http://djangopackages.com Dawno dawno temu była sobie całkiem przyjemna strona Django Pluggables, na której można było znaleźć liczne aplikacje do wykorzystania we własnych projektach. Poźniej, jak pamiętam, pojawił się na liście dyskusyjnej … Continue reading →

Przeczytaj cały wpis »

Piramidalna zemsta Zope

Posted on Listopad 5, 2010 at 9:24 po południu by restlessbeing RSS

Przesadziłem? Ok, z tym sprostaniem konkurencji ze strony Django to taka mała prowokacja. Niemniej jednak połączenie się wspomnianych frameworków jest oficjalnym faktem. Można o tym przeczytać na liście dyskusyjnej repoze.bfg, do czego zachęcam. W kilku słowach ujmując zaistniałe zdarzenie, można powiedzieć, że repoze.bfg nie doczeka się wersji 1.4 (wersja 1.3 ukazała się 1 listopada... nomen omen w Święto Zmarłych), albowiem stało się właśnie frameworkiem Pyramid. Podobnie ma się sprawa z samymi Pylonsami, ktore niedawno doczekały się wersji 1.0 (linia 1.x będzie utrzymywana, według deweloperów, jeszcze przez parę lat), ale to co miało być Pylonsami 2.0 będzie po prostu frameworkiem Pyramid. Pyramid rozwijany będzie w ramach projektu Pylons, który stanowić będzie zbiór różnych powiazanych technologii. TurboGears, które bazuje na Pylonsach, jeszcze nie zdecydowało, czy również będzie się opierało na Pyramidzie, czy jednak zostanie na Pylons 1.0. Moim zdaniem zdecydują się na Pyramid. Jakie są motywy powyższego kroku? Chodzi głównie o zwiększenie siły przebicia frameworku oraz o przezwyciężenie pewnych problemów, które Pylons miał ze swoją achitekturą: (Jeden z twórców Pylons) discovered an architectural design flaw in Pylons [1]. The problem orients around the chosen strategy of implementing individual app extensibility by allowing subclassing of the WSGIController Sporo na ten temat można znaleźć ...

Przeczytaj cały wpis »

Piramidalna zemsta Zope

Posted on Listopad 5, 2010 at 9:24 po południu by restlessbeing RSS

Zagotowało się w świecie pythonowych frameworków webowych. Pylons, Repoze.BFG i być może TurboGears, nie mogąc sprostać konkurencji ze strony Django, postanowiły połączyć swoje siły. Przesadziłem? Ok, z tym sprostaniem konkurencji ze strony Django to taka mała prowokacja. Niemniej jednak połączenie … Continue reading →

Przeczytaj cały wpis »

Sortowanie wersji w Pythonie.

Posted on Listopad 2, 2010 at 8:31 po południu by forgottenlabs RSS

Niech g będzie listą stringów wyglądających jak nr wersji jakiegoś pakietu: g = ["1.1", "1.2", "1.10", "1.6", "1.65", "1.59", "1.23"] Jak wykorzystując pythona posortować tę listę tak aby otrzymać wersje chronologicznie? ['1.1', '1.2', '1.6', '1.10', '1.23', '1.59', '1.65'] Wykorzystujemy do tego moduł distutils.version: In [1]: from distutils.version import StrictVersion In [2]: g = ["1.1", "1.2", [...]

Przeczytaj cały wpis »

Django i MySQL a UTF8.

Posted on Listopad 2, 2010 at 10:27 rano by forgottenlabs RSS

Kolejny ultrakrótki wpis, który w jednym akapicie tłumaczy co zrobić, gdy pojawi się nam taki error: Incorrect string value: '\xC5\x9B\xC4\x87\xC5\xBA...' for column 'first_name' at row 1 (standardowy Exception (konkretniej Warning) na żółto szarym tle. Pogrubione elementy mogą się różnić). Rozwiązanie jest proste. Podczas tworzenia bazy trzeba dodać: CREATE DATABASE foobardb DEFAULT CHARACTER SET utf8; I… [...]

Przeczytaj cały wpis »

Django Version Control for the Poor ;)

Posted on Listopad 1, 2010 at 12:40 po południu by Stanisław Adaszewski RSS

Most of the time version control (VC) is more than welcome in IT solutions, providing ways to roll back unwanted changes, monitor work progress, analyze modification trends, etc. etc. For Django, reversion seems to be the de facto standard for versioning model instances. Unfortunately it is based on serialization (in e.g. JSON) of objects and [...]

Przeczytaj cały wpis »

Integracja edytorów grafiki z aplikacjami Django

Posted on Listopad 1, 2010 at 8:17 rano by Biblioteka Pythona | Django RSS

Wykorzystujemy internetowe edytory grafik takie jak FotoFlexer, Picnik i Pixlr w aplikacjach Django

Przeczytaj cały wpis »

Przechwyt obrazu z kamerki internetowej za pomocą jpegcam

Posted on Październik 16, 2010 at 9:14 po południu by Biblioteka Pythona | Django RSS

Integrujemy z Django widżet jpegcam umożliwiający przechwyt i zapisywanie zdjęć z kamerek internetowych użytkowników.

Przeczytaj cały wpis »

Był sobie PyCon

Posted on Październik 14, 2010 at 10:24 po południu by restlessbeing RSS

W zeszłym tygodniu odbył się w Ustroniu trzeci polski PyCon. Byłem, widziałem, a oto moje wrażenia. Rok temu na PyConie miałem zaszczyt wygłaszać prelekcję na temat Django oraz Pinaxa. Fajne doświadczenie, ale też wymagające sporej ilości czasu. Tego ostatniego w … Continue reading →

Przeczytaj cały wpis »

Był sobie PyCon

Posted on Październik 14, 2010 at 9:24 po południu by restlessbeing RSS

Rok temu na PyConie miałem zaszczyt wygłaszać prelekcję na temat Django oraz Pinaxa. Fajne doświadczenie, ale też wymagające sporej ilości czasu. Tego ostatniego w tym roku mi zabrakło, wobec czego pojechałem do Ustronia w charakterze zwykłego uczestnika. Społeczność Jak to ktoś ładnie napisał (Katharsis?) PyCon jest nieoficjalnym zlotem ludzi z kanału IRC #python.pl, a także #django-pl. Wyróżniamy się zwykle koszulkami z ładnymi nadrukami oraz przesiadywaniem w okolicach stołu bilardowego. Miło jest się ponownie spotkać lub zobaczyć po raz pierwszy (bo przecież kanały żyją i się rozrastają i ciągle pojawia się ktoś nowy) i oczywiście podyskutować na okołopythonowe tematy. Zainteresowanych tym jak to wszystko naprawdę wyglądało odsyłam do blogów RMZ i Katharsisa, gdzie już są lub wkrótce pojawią się zdjęcia. Oczywiście PyCon to też okazja do poznania ciekawych osób spoza IRC. W tym roku poznałem, o zgrozo, speców od Ruby On Rails z firmy Selleo. Nie znam RoR, ale mam do niego duży szacunek, tym ciekawiej było porozmawiać na temat różnic i podobieństw między tym frameworkiem a Django, a także ogólnie o Ruby i Pythonie oraz procesach wytwarzania oprogramowania. Tematów było zresztą więcej bo panowie imponowali rozległą wiedzą nie tylko techniczną ale i biznesową. Technikalia Z różnych względów nie byłem na ...

Przeczytaj cały wpis »

Instalacja i polonizacja TinyMCE w Django

Posted on Wrzesień 21, 2010 at 11:21 rano by Katharsis's devblog RSS

Chodź edytory WYSIWYG nie potrafią tworzyć w pełni semantycznego kodu HTML, dla szarego Kowalskiego pełnią rolę wygodnego narzędzia. Z punktu widzenia programisty ręczne zarządzanie treścią daje mi pełną swobodę i kontrolę nad znacznikami, co zwiększa prawdopodobieństwo poprawności i przejrzystości kodu. Jednakże, nie zmuszajmy swoich klientów do tego by korzystali z BBCode, Markdown czy czystego HTML, [...]

Przeczytaj cały wpis »

Widgety z contrib.admin w naszej aplikacji

Posted on Sierpień 19, 2010 at 7:32 po południu by Natcam RSS

Standardowe widgety znajdujące się w django.forms.widgets często okazują się być zbyt ubogie dla naszych aplikacji. Typowym przykładem może być widget dla pola DateField, który renderuje się jak zwyczajne pole tekstowe (a gdzie jakiś kalendarzyk?). Inny przykład to widget dla FileField, który podczas edycji obiektu nie wyświetla informacji o już załadowanym pliku i w efekcie nie wiemy czy coś już zostało wgrane czy nie. Problemy te nie występują natomiast w panelu administracyjnym, gdzie pola z datą mają powiązane ładne kalendarze, a pole do ładowania plików wyświetla url do zasobu już wcześniej wgranego. Jak zatem skorzystać z tego dobrodziejstwa? Nie zawsze jest to oczywiste, zwłaszcza w przypadku gdy widget do działania potrzebuje JavaScriptu (np. AdminDateWidget). Po kolei. Najpierw kod formularza i przypisanie widgetów do pól (na dwa sposoby): from django import forms from my_app.models import Product, Payment from django.contrib.admin import widgets class ProductForm(forms.ModelForm): class Meta: model = Product def __init__(self, *args, **kwargs): super(ProductForm, self).__init__(*args, **kwargs) self.fields['mydate'].widget = widgets.AdminDateWidget() class PaymentForm(forms.ModelForm): class Meta: model = Payment widgets = { 'field1' : AdminFileWidget, 'field2' : AdminDateWidget } następnie szablon w którym będzie wyświetlony widget. Dołączamy potrzebne pliki z kodem JavaScript (nie wszystkie widgety tego wymagają, bo nie wszystkie korzystają z JavaScriptu). {% extends "base_site.html" ...

Przeczytaj cały wpis »