2009-09-09 9 views
8

Cela peut être une question simple, mais je ne peux pas sembler le saisir.Django: afficher la liste de beaucoup à plusieurs éléments dans l'interface d'administration

J'ai deux modèles simples dans models.py: Service et Host. Host.services a une relation m2m avec Service. En d'autres termes, un hôte dispose de plusieurs services et un service peut résider sur plusieurs hôtes; un m2m basique.

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) 

Maintenant, quand j'ouvre la page où toutes les colonnes de l'hôte sont répertoriées la colonne 'service' affiche la sortie comme:

Obtenir des services

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

Au lieu de:

services

the_service-1

the_service-2 etc.

Qu'est-ce que je fais mal? Merci d'avoir lu ma question.

+0

J'ai mis à jour ma réponse. –

Répondre

19

Vous devez changer get_services à quelque chose comme:

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

Mise à jour: Essayez d'utiliser \n comme séparateur plutôt que <br/>, comme la sortie de get_services est échappé.

+1

+1. Souhait qu'il y avait une meilleure façon de faire cela que le formatage HTML en dur dans une méthode de modèle. –

+1

C'est juste un moyen. Un autre serait de rendre un modèle à la chaîne et retourner le résultat - cela déplacerait le HTML au modèle. Cependant, ceci est pour l'administrateur Django - qui est pour les administrateurs système plutôt que pour les utilisateurs finaux - donc peut-être que l'approche utilitaire est OK. –

+1

Merci, la réponse a fait l'affaire. –

Questions connexes