Django:在后台显示多对多项的列表

8 投票
1 回答
6813 浏览
提问于 2025-04-15 14:10

这可能是个简单的问题,但我就是搞不懂。

我在models.py里有两个简单的模型:Service和Host。Host.services和Service之间是多对多的关系。换句话说,一个主机可以有多个服务,而一个服务也可以在多个主机上运行;这就是基本的多对多关系。

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)

现在,当我打开显示所有主机信息的页面时,'service'这一列的输出是这样的:

获取服务

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

而不是:

服务

the_service-1

the_service-2

等等。

我哪里做错了?

谢谢你阅读我的问题。

1 个回答

19

你应该把 get_services 改成类似下面这样的:

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

更新:试着用 \n 作为分隔符,而不是 <br/>,因为 get_services 的输出内容被转义了。

撰写回答