2009-09-09 14 views
8

To może być proste pytanie, ale nie mogę tego zrozumieć.Django: wyświetl listę wielu elementów w interfejsie administratora

Mam dwa proste modele w models.py: Service and Host. Host.services ma relację m2m z usługą. Innymi słowy, host ma kilka usług i jedna usługa może znajdować się na wielu hostach; podstawowe m2m.

models.py

class Service(models.Model): 
    servicename = models.CharField(max_length=50) 

    def __unicode__(self): 
      return self.servicename 

    class Admin: 
      pass 

class Host(models.Model): 
    #... 
    hostname = models.CharField(max_length=200) 
    services = models.ManyToManyField(Service) 
    #... 

    def get_services(self): 
      return self.services.all() 

    def __unicode__(self): 
      return self.hostname 

    class Admin: 
      pass 

admin.py

from cmdb.hosts.models import Host 
from django.contrib import admin 


class HostAdmin(admin.ModelAdmin): 

    list_display = ('get_services',) 

admin.site.register(Host, HostAdmin) 

Teraz kiedy otworzyć stronę, na której wszystkie kolumny przez przyjmującego są wymienione w kolumnie 'usługa' wyświetla wyjście jak:

Uzyskaj usługi

[<Service: the_service-1>, <Service: the_service-2>]

Zamiast:

Usługi

the_service-1

the_service-2 itp

Co robię źle? Dziękuję za przeczytanie mojego pytania.

+0

Zaktualizowałem moją odpowiedź. –

Odpowiedz

19

należy zmienić get_services coś jak:

def get_services(self): 
    return "\n".join([s.servicename for s in self.services.all()]) 

Aktualizacja: Spróbuj użyć \n jako separatora zamiast <br/>, jako wyjście get_services jest uciekł.

+1

+1. Szkoda, że ​​nie było lepszego sposobu na to niż twarde kodowanie HTML w metodzie modelowej. –

+1

To tylko jeden sposób. Innym byłoby renderowanie szablonu do łańcucha i zwracanie wyniku - to przesunie kod HTML do szablonu. Jest to jednak dla administratora Django - który jest dla sysadminów, a nie użytkowników końcowych - dlatego może utylitarystyczne podejście jest w porządku. –

+1

Dziękuję, odpowiedź załatwiła sprawę. –

Powiązane problemy