2009-09-09 85 views
8

這可能是一個簡單的問題,但我似乎無法理解它。Django:顯示管理界面中多項至多項的列表

我在models.py中有兩個簡單模型:Service和Host。 Host.services與Service具有m2m關係。 換句話說,主機有多個服務,一個服務可以駐留在多個主機上;一個基本的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) 

現在,當我打開所有主機的列中列出的 '服務' 列中的頁面顯示等的輸出:

獲取服務

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

相反的:

服務

the_service-1

the_service-2 等

我到底做錯了什麼? 謝謝你閱讀我的問題。

+0

我更新了我的答案。 – 2009-09-09 10:14:39

回答

19

你應該改變get_services到類似:

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

更新:嘗試使用\n作爲分隔符,而不是<br/>,作爲get_services的輸出被轉義。

+1

+1。希望有一個更好的方法來做到這一點,而不是在模型方法中對HTML格式進行硬編碼。 – 2009-09-09 09:58:32

+1

這只是一種方式。另一種方法是將模板渲染爲字符串並返回結果 - 這會將HTML移動到模板中。但是,這是爲Django管理員 - 這是爲系統管理員,而不是最終用戶 - 因此,也許功利主義方法是好的。 – 2009-09-09 10:12:37

+1

謝謝,答案的確有用。 – 2009-09-09 10:54:16