Jako, że od pewnego czasu zgłębiam tajniki Django (najlepszą metodą - próba przeportowania aplikacji powstałej na Symfony), napotkałem ostatnio problem z aplikacją Auth i jej sposobem wyświetlania użytkownika w polach <select>.

Otóż domyślnie, metoda __unicode__ modułu User zwraca po prostu nazwę użytkownika (username). Pole to jest wymagane oraz unikalne dla każdego z użytkowników, więc zwrócony wynik zawsze będzie jednoznacznie kierował do wybranego usera.

Co jednak w przypadku większej liczby użytkowników? Ciężko będzie zapamiętać loginy wszystkich insteresujących nas osób. Można oczywiście wykorzystać dziedziczenie i stworzyć własną klasę nadpisując metodę, lecz to rozwiązanie zadziała tylko dla naszego własnego kodu - moduły aplikacji Auth nadal będą korzystały ze standardowych klas, więc np. wewnątrz administracji Jan Kowalski nadal pozostanie tylko uzytkownik-iem.

Rozwiązaniem problemu okazało się użycie niedocenionej wcześniej funkcji lambda (bo po co mi takie dziwadło?) - za jej pomocą można nadpisać obecną metodę i zmusić system do wyświetlania np. imienia i nazwiska, lub innych, dowolnie skomplikowanych kombinacji, np.:

 
from django.contrib.auth.models import User
User.__unicode__ = lambda u: "%s, %s [%s]" % (u.last_name, u.first_name, u.username)
 

Tym sposobem, zamiast

uzytkownik

otrzymujemy

Kowalski, Jan [uzytkownik]

Co dziwne, nigdzie nie mogłem znaleźć rozwiązania problemu, a w trac'u django prośby o możliwość opcjonalnej zmiany wyświetlania pozostały jako wontfix.

Mam nadzieję, że komuś się przyda, ewentualnie proszę o lepsze rozwiązanie.

Komentarze do wpisu "Django i domyślne wyświetlanie nazwy użytkownika w Auth":

1. hcz napisał(a):
04 stycznia 2009, 00:53:33

Tak dla formalności — akurat lambda nie jest tu kluczem do rozwiązania problemu. Równie dobrze można tak:

def funkcja(u): return ‘%s $s [%s]’ % (u.last_name, u.first_name, u.username)

User.unicode = funkcja

2. chester napisał(a):
04 stycznia 2009, 15:07:05

też o tym najpierw pomyślałem i spróbowałem tak… i dałbym głowę, że nie chciało wtedy działać, choć teraz jak sprawdziłem ponownie to wszystko jest ok… ;)

Dodaj komentarz: