2009-11-21 8 views
1

je veux faire quelque chose comme ceci:entrées de blog par année, annonce mois

Entries.objects.values('date.year','date.month') 

mais cette ligne ne sont pas valides. Comment puis-je lister les entrées de blog par année, mois et les afficher dans un modèle?

Merci!

Répondre

8

Si vous définissez

entry_list = Entry.objects.order_by('pub_date') 

dans votre vue, vous pouvez afficher les mois et les années dans le modèle en utilisant la balise de modèle ifchanged.

{% for entry in entry_list %} 
{% ifchanged %}<h3>{{entry.pub_date|date:"Y"}}</h3>{% endifchanged %} 
{% ifchanged %}<h4>{{entry.pub_date|date:"F"}}</h4>{% endifchanged %} 
<p>{{entry.title}}</p> 
{% endfor %} 

Une autre méthode Django queryset utile pour les archives du blog est dates.

Par exemple

entry_months = Entry.objects.dates('pub_date','month','DESC') 

retourne un DateQuerySet de datetime.datetime objets pour chaque mois qui a des entrées de blog. Vous pouvez utiliser ce jeu de requête dans le modèle pour créer des liens vers des pages d'archives mensuelles.

1

Voici un code snipped de mon blog où je liste toutes les entrées de blog dans une certaine année:

Entries.objects.filter(draft=drafts).filter(posted_date__year=year).order_by(order_by) 

Dans ce qui précède:

  • drafts est un booléen qui spécifie si afficher les éléments terminés ou non.
  • year est l'année sélectionnée
  • order_by est un nom de colonne de commande.

Vous devriez pouvoir facilement modifier cet exemple pour inclure également le mois. Ce qui précède montre que vous pouvez combiner plusieurs filtres d'affilée.

4

Vous pouvez essayer avec le tag de regroupement intégré.

À votre avis:

archives = Entries.objects.all() 

Dans votre modèle:

{% regroup archives by date.month as entries_by_month %} 
{% for entries in entries_by_month %} 
    <h1>{{ entries.list.0.date|date:"F Y" }}</h1> 
    <ul> 
    {% for entry in entries.list %} 
     <li>{{ entry.title }}</li> 
    {% endfor %} 
    </ul> 
{% endfor %} 
0

Ok, nous allons essayer de faire soulever des objets lourds dans la structure de données, au lieu de modèles.

Créons un utilitaire.

import itertools 

def group_by_values(posts, key): 
    groups = {} 
    for k, g in itertools.groupby(posts, key): 
     if groups.get(k) is not None: 
      groups[k].extend(list(g)) 
     else: 
      groups[k] = list(g) 
    return groups 

Utilisons l'utilitaire ici.

entries = Entry.objects.all().order_by('date') 
yearly_entries = group_by_values(entries, key=lambda x: x.date.year) 
monthly_yearly_entries = {} 
for k, v in yearly_entries.items(): 
    monthly_yearly_entries[k] = group_by_values(v, key=lambda x: x.date.month) 
return monthly_yearly_entries 

Le résultat est agréable avec le dictionnaire années et des mois comme des clés comme celui-ci:

monthly_yearly_entries = {2013: {9: [Entry1, Entry2], 10: [Entry4, Entry5]}} 

que vous pouvez afficher bien dans les modèles

Questions connexes