Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

python

django

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.

like image 852
Bas van der Zon Avatar asked Sep 09 '09 09:09

Bas van der Zon


1 Answers

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.

like image 158
Vinay Sajip Avatar answered Oct 03 '22 23:10

Vinay Sajip