2013-04-19 2 views
0

J'ai 2 modèles:Comment utiliser un champ ForeignKey comme filtre dans Django?

class Category(models.Model): 
    title = models.CharField(max_length=250) 
    ### other fields 

class Album(models.Model): 
    category = models.ForeignKey(Category) 
    subject = models.CharField(max_length=200) 
    ### other fields... 

.

Je viens d'écrire une vue pour filtrer les albums par catégorie specefic, aussi je les veux tous dans le modèle home.html:

#views.py 
def commercial(request): 
    commercial_subjects = Album.objects.filter(category__title__contains="commercial") 
    return render(request, 'gallery/index.html', {'commercial_subjects': commercial_subjects}) 

Et il fonctionne très bien pour seulement la catégorie commerciale. Cela ressemble à un codage en dur si je veux écrire plusieurs vues pour chaque catégorie comme celle-ci. Ce dont j'ai besoin, c'est d'une vue ou d'un processus de filtrage qui montre automatiquement toutes les catégories et leur album. Ainsi, le résultat final doit ressembler à ceci:

Personal

  • ALBUM 1
  • ALBUM 2

commercial

  • ALBUM 4
  • ALBUM5

Comment puis-je faire cela?

Répondre

1

C'est facile. Tout d'abord donner un related_name à la clé étrangère:

class Album(models.Model): 
    category = models.ForeignKey(Category, related_name='albums') 

De toutes les catégories passent vue:

def myView(request): 
    categories = Category.objects.all() 
    return render(request, 'gallery/index.html', {'categories': categories}) 

Ensuite, dans le modèle:

<ul> 
    {% for category in categories %} 
     <li>{{ category.title }}</li> 
     {% with category.albums.all as albums %} 
      {% if albums %} 
       <ul> 
        {% for album in albums %} 
         <li>{{ album.subject }}</li> 
        {% endfor %} 
       <ul> 
      {% endif %} 
     {% endwith %} 
    {% endfor %} 
</ul> 
0
#views.py 
def commercial(request): 
    commercial_subjects = Album.objects.filter(category__title="commercial") 
+0

Ceci est juste ce que je disais. Je veux que sth lise toutes les catégories et les albums associés, pas seulement les albums de liste liés à la catégorie commerciale. – sheshkovsky

Questions connexes