wtorek, 1 kwietnia 2008

Własne pola w kolumnach listy w panelu admina

Django admin pozwala na zdefiniowanie listy pól które mają być wyświetlane w liście a panelu admina.

class MyModel(models.Model):      ....      class Admin:            list_display=['name','surname',...] 

Pola te nie muszą być stricte polami modelu ( czyli dziedziczącymi z models.Field ), ale mogą to być również zwykłe pola klasy, lub też metody. Jeżeli jest to metoda obiektu zostanie ona wywołana a jej wynik znajdzie się w kolumnie. I tak np. możemy zrobić sobie:

class MyModel(models.Model):     name = models.CharField(max_length=100)     surname = models.CharField(max_length=100)     ...      def full_name(self):         return u"%s %s"%(self.name, self.surname)      class Admin:         list_display=['login','full_name','email'] 

Dla każdego obiektu zostanie wywołana metoda full_name a wynik jej działania będzie widoczny w kolumnie "full_name"

Wynik wywołania funkcji zostanie przed pokazaniem w templacie wyeskejpowany, ale i na to twórcy django zrobili obejście. Jeżeli takiej metodzie damy atrybut allow_tags ( metody i funkcje w pythonie również mogą posiadać atrybuty ). Jeżeli np. chcemy aby taka kolumna była jakoś wyróżniona możemy zrobić to tak (przykład jak wyżej):

class MyModel(models.Model):     name = models.CharField(max_length=100)     surname = models.CharField(max_length=100)     ...      def full_name(self):         return u'%s %s'%(self.name, self.surname)     full_name.allow_tags = True     full_name.short_description = "Full name"      class Admin:         list_display=['full_name',] 

Po takiej deklaracji kolumna będzie miała nazwę "Full name", a wartości w niej znajdujące się będą miały kolor czerwony.

UWAGA: należy pamiętać o wyeskejpowaniu wartości które mogły zostać wprowadzone przez użytkownika.

W połączeniu z własnymi templatami do listy obiektów, które dziedziczą z szablonu "admin/change_list.html" możliwe jest np. dodanie możliwości masowego kasowania lub modyfikowania obiektów.

Brak komentarzy: