2017-09-05 3 views
1

J'ai du mal à essayer d'accéder à l'élément clé étrangère de mon modèle. Je suis en train de passer plusieurs contextes grâce à la vue de la classe comme ceci:Comment boucler dans une boucle dans django en passant plusieurs contextes

class HomeView(ListView): 
    template_name = "homepage/home.html" 
    queryset = Author.objects.all() 
    def get_context_data(self, **kwargs): 
     context = super(HomeView, self).get_context_data(**kwargs) 
     context['author_links'] = Author_link.objects.all() 
     context['categories'] = Category.objects.all() 
     context['extra_links'] = Extra_link.objects.all() 
     context['poems'] = Poem.objects.all() 
     return context 

mon fichier models.py:

class Author(models.Model): 
    name = models.CharField(max_length=30) 
    def __str__(self): 
     return self.name 

class Author_link(models.Model): 
    url_text = models.CharField(max_length=100) 
    url = models.CharField(max_length=200) 
    author = models.ForeignKey(Author) 
    def __str__(self): 
     return self.url_text 

class Category(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.TextField() 
    class Meta: 
     verbose_name_plural = 'categories' 
    def __str__(self): 
     return self.name 

class Extra_link(models.Model): 
    url_text = models.CharField(max_length=100) 
    url = models.CharField(max_length=200) 
    category = models.ForeignKey(Category) 
    def __str__(self): 
     return self.url_text 

mais quand je suis en train de boucler dans le contexte que je ne peux pas sembler accès la clé étrangère de chaque élément:

{% for author in object_list %} 
    <li class = "collection-item"> 
    <ul class="collapsible" data-collapsible="accordion"> 
     <li> 
     <div class="collapsible-header">{{author.name}}</div> 
     <div class="collapsible-body"> 
      {% for item in author.item_set.all %} 
      <p>{{item.url}}</p> 
      {% endfor %} 
     </div> 
     </li> 
    </ul> 
    </li> 
    {% endfor %} 

ce que je suis en train de faire est une boucle par les auteurs et en même temps dans chaque boucle d'auteur à travers les urls qui sont associés à chaque auteur.

+0

Il n'y a pas de relation dans vos modèles entre Auteur et Catégorie. Et qu'est-ce que 'item_set' est censé être? Exactement ce que vous essayez de parcourir pour chaque auteur? –

Répondre

0

où vous avez

{% for item in author.item_set.all %} 
    <p>{{item.url}}</p> 
{% endfor %} 

vous devriez avoir quelque chose comme

{% for item in author.author_link_set.all %} 
    <p>{{item.url}}</p> 
{% endfor %} 

Ce gestionnaire (author.author_link_set) est ajouté à chaque auteur, car il est une clé étrangère de Author_link à Author. Remarque: la convention pour les noms de classes en python est Pascal Case, par exemple AuthorLink et non Author_link. Je mentionne ceci parce que je ne suis pas sûr à 100% si j'ai correctement deviné le nom de la relation inverse sur l'auteur (author.authorlink_set, je n'ai jamais vu un trait de soulignement dans un nom de modèle - django peut faire quelque chose de spécial dans ce cas

+0

Merci. Ça a marché. J'ai fait une petite erreur en copiant le code sur ce site. Je l'ai changé à ce que je faisais réellement. –

+0

@SubhadeepSarkar vous pouvez écrire '{% si author.author_link_set.all%} class =" corps-pliable "{% endif%}' si vous avez beaucoup d'auteurs, vous pouvez éviter d'exécuter beaucoup de requêtes en utilisant 'queryset = Author .objects.all(). prefetch_related ("author_link_set") ' – Jiaaro