2013-10-13 5 views
0

Je sais que c'est simple, mais je n'arrive pas à comprendre comment joindre certains modèles pour les afficher dans mon modèle dans Django. J'ai des "groupes" qui peuvent avoir plusieurs "contacts".Obtention et affichage d'objets associés dans Django

Jusqu'à présent, j'ai:

class Group(models.Model): 
    group_name = models.CharField() 

class Contact(models.Model): 
    contact_name = models.ForeignKey(Group) 

À mon avis, tout d'abord je suppose que simplement obtenir mes groupes seraient également obtenir des contacts ci-joints, mais cela ne semble pas se passer comme prévu:

def get_queryset(self): 
    groups = Group.objects.all() 
    return groups 

Je comptais faire quelque chose comme ça dans mon modèle:

{% for group in groups %} 
    <h2>{{ group.group_name }}</h2> 
    {% for c in group.contact %} 
     <h3>{{ c.contact_name }}</h3> 
    {% endfor %} 
{% endfor %} 

Cela ne fonctionne pas - qu'est-ce que je fais mal? À mon avis, quelle est la bonne question pour s'assurer que le (s) contact (s) de chaque groupe est récupéré (s)?

+1

'{% pour c dans group.contact_set.all%}' –

+0

Comme indiqué dans cette partie du doc: https://docs.djangoproject.com/fr/1.5/ref/models/relations/ – sebastibe

+0

Merci Burhan , la façon dont je lisais les docs, je pensais que la méthode .contact_set devait être utilisée dans la vue, je ne pensais même pas à l'utiliser dans le template comme ça. Apprécié :) – mrhigham

Répondre

1

Eh bien, il semble que vous avez une partie de votre code à partir d'un endroit différent si juste pour que vous puissiez bien comprendre, vous pouvez le faire en 2 différentes façons:

1) Pour y accéder un objet lié d'aucune sorte, être un simple ForeignKey ou ManyToMany vous avez juste besoin de passer du modèle opposé et utiliser _set comme cet exemple:

class Group(models.Model): 
    group_name = models.CharField() 

class Contact(models.Model): 
    contact_name = models.ForeignKey(Group) 

{{ group.contact_set.all }} 

2) vous pouvez configurer un nom différente de la valeur par défaut _set changer Contact comme ceci:

class Contact(models.Model): 
    contact_name = models.ForeignKey(Group, related_name='contacts') 

Ainsi, related_name kwarg a établi un nouveau nom pour vous au lieu de _set un:

{{ group.contacts.all }} 

J'espère que je parviens à le rendre plus clair sur simple, accès sur les objets liés aux modèles.

+0

Génial, merci! J'avais lu à propos de la méthode "_set", mais je n'avais pas réalisé qu'il devait être utilisé dans le template. J'ai pensé que je devais l'utiliser dans la vue avant de commencer à regarder le gabarit ...! Merci pour votre excellente réponse. – mrhigham

+0

Oui, vous pouvez l'utiliser n'importe où pour accéder à l'objet associé. Pas de problème, je suis content que je puisse aider. :) –

Questions connexes