Zażółć Gęślą Jaźń w Django

Wszyscy developerzy Django, których kiedykolwiek zainteresował/zaskoczył unikodowy galimatias w Pythonie zapewne wiedzą, że modele i poszczególne pola typu CharField, TextField itd. zwracają swoje wartości w unicode. W związku z tym kod typu

 
"Mój wspaniały artykuł - %s"%model.title
 

nie zadziała z powodu niezgodności formatów łączonych łańcuchów (unicode i nieunicode). Mogłoby się wydawać, że wystarczy dopisać # -*- coding: UTF-8 -*- na początku pliku z owym kodem oraz dodać magiczną literkę u przed stringiem:

 
u"Mój wspaniały artykuł - %s"%model.title
 

jednak i tu napotkamy lipę - problemy z kodowaniem. Rozwiązaniem jest dosyć rozwlekła jak na pythona linijka:

 
unicode("Mój wspaniały artykuł - %s", "utf-8")%model.title
 

Dodatkowo, jeżeli umieszczamy ten kod np w funkcji __str__ jakiegoś obiektu, całość należy ująć w nawias i doklepać na końcu .encode('utf-8')

Pytanie moje brzmi - czy można szybciej?

...

Djangowe ciekawostki

06 25 2009

In Django, Python

Dodaj komentarz

  1. Kod django wykonywany jest tylko jednokrotnie w ramach jednej instancji serwera (cokolwiek to znaczy). Czyli print 'lool' w models.py zostanie wykonane tylko raz. Również obiekty utworzone w ten sposób "zapamiętują" swój stan pomiędzy requestami. Bug or feature? Czy to zadziała w każdym przypadku?
  2. Signal.connect w Middleware.process_request czasem działa, a czasem nie. Truly random. Mimo problemów wynikających z pkt 1 connecty najlepiej robić w ciele models.py, ewentualnie w management.py w przpadku post_syncdb.
  3. Pythonicznie - classobj vs. type, może warto się przyjrzeć