Bas van der Zon Bas van der Zon - 6 months ago 19
Python Question

Django: show list of many to many items in the admin interface

This might be a simple question, but i can't seem to grasp it.

I have two simple models in models.py: Service and Host. Host.services has a m2m relationship with Service.
In other words, a host has several services and one service can reside on multiple hosts; a basic 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)


Now when i open the page where all the host's columns are listed the 'service' column displays the output like:

Get services

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


Instead of:

Services

the_service-1

the_service-2
etc.

What am i doing wrong?
Thank you for reading my question.

Answer

You should change get_services to something like:

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

Update: Try using \n as the separator rather than <br/>, as the output of get_services is being escaped.