Django i domyślne wyświetlanie nazwy użytkownika w Auth
03 stycznia, 2009
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: