2010-08-12 10 views
2

J'essaie de montrer le contenu d'un manytomanyfield dans l'interface d'administration. J'ai le code suivant:django afficher le contenu manytomanyfield

class Member(models.Model): 
    group = models.ManyToManyField('Group') 

    def group_gp_name(self): 
     return self.group.gp_name 

    def __unicode__(self): 

     return u'%s' % (self.id) 

class Group(models.Model): 
    gp_name = models.TextField(verbose_name=u'Group Name') 

    def __unicode__(self): 
     return u'%s - %s' % (self.id, self.gp_name) 

Dans l'administration j'ai quelque chose comme ceci:

class MemberAdmin(admin.ModelAdmin): 
    list_display = ('group_gp_name') 

Cette méthode a fonctionné pour montrer des données foreignkey. Évidemment, cela ne fonctionne pas avec ManytoManyFields .. donc ma question est, comment puis-je montrer les noms de mes groupes dans ma page d'admin sous Member. Donc quand je clique dans l'admin sur 'Membre' je veux voir immédiatement le contenu des noms de Groupe couplés par la relation manytomany?

MISE À JOUR !!! - Je ne veux pas les montrer dans ma page de changement, je veux juste voir le résultat dans le tableau. Je l'ai trouvé cela et il est presque ce que je veux:

def get_sol(self): 
     return self.group.all() 

Cela fonctionne, mais la vue est peu bizarre, il montre quelque chose comme ceci:

<Group: Administrators >] 

Le problème est, je ne sais pas veux voir ceux '[Group:' et '>]', alors comment m'en débarrasser?

MISE À JOUR2 !!!

Il m'a aidé, mais que se passe-t-il si par exemple cela se produit? J'ai une 3ème table appelée test comme ceci:

class Test(models.Model): 
    member = models.ForeignKey('Member') 

Maintenant, je veux show dans la vue admin « Test » le nom du groupe de la table « Groupe », comment est-ce possible?

Toute aide est appréciée.

Cordialement, T

+0

J'ai édité ma réponse - laissez-moi savoir si cela fonctionne pour vous! –

Répondre

0

Si vous voulez voir votre nombre à plusieurs champs de la page de changement, vous devez utiliser admin inlines.

class GroupInline(admin.TabularInline): 
    model = Group 

class MemberAdmin(admin.ModelAdmin): 
    list_display = ('group_gp_name') 
    inlines = [ 
     GroupInline, 
    ] 

Poster votre mise à jour, que vous êtes intéressé par l'affichage de la liste plutôt que la page de changement, essayez de changer get_sol à:

def get_sol(self): 
    return '; '.join([group.gp_name for group in self.group.all()]) 

après votre deuxième mise à jour, ajoutez une méthode sur Test:

class Test(models.Model): 
    member = models.ForeignKey('Member') 

    def get_member_sol(self): 
     return self.member.get_sol() 
+0

Pourriez-vous regarder ma mise à jour2 s'il vous plaît? Votre solution a également fonctionné – Thomas

+0

@Thomas - done. –

+0

Merci beaucoup, ça marche super! Je commence à comprendre le comportement. Quoi qu'il en soit, quand je veux obtenir les valeurs du champ manytomany, puis-je utiliser quelque chose comme ça dans la vue? test = Test.objects.get (id = 1) solutuion = test.member.group.gp_name Ceci me donne la solution liée à cet objet dans une variable sans '[Group' and '>]' entre parenthèses ou y a-t-il une autre méthode pour cela? – Thomas

0

Vous ne pouvez pas l'utiliser comme ça. Parce que ManyToManyFields crée une table intermadiate pour connecter deux tables. Ainsi, le groupe peut renvoyer plusieurs résultats.

def group_gp_name(self): 
    a = self.group.select_related() 
    # this will return you a list, so 
    return ','.join(x.gp_name for x in a) 

Cela vous ramènera toutes les valeurs pg_name connexes séparées par (,)

MISE À JOUR: ""

class Test(models.Model): 
    member = models.ForeignKey('Member') 


def get_gp_name(self): 
    ','.join(x.gp_name for x in self.member.group.select_related()) 

Depuis msmber est un foreignkey, vous n'avez pas problème à l'aide notation pour utiliser la relation foreignkey.

+0

pour écrire un vomissement, je divise la fonction en deux lignes séparées, bien sûr vous pouvez utiliser return ','. Join (x.gp_name pour x dans self.group.select_related()) à la place – FallenAngel

+0

Pourriez-vous regarder mon UPDATE2 s'il vous plaît, votre solution a bien fonctionné! – Thomas

Questions connexes