Ce genre de question semble arriver assez souvent. La solution la plus simple consiste à parcourir les données et à regrouper les objets par année et par mois. Vous pouvez le faire à la main dans la vue ou en utilisant regroup dans votre modèle. Cela dépend vraiment de ce que vous voulez faire avec les données.
Si le regroupement d'archives par année et par mois est une opération très courante dans votre application, vous pouvez envisager de créer un champ d'année et de mois que vous remplissez dans save().
À la main, il pourrait être quelque chose comme ceci:
arch = {}
for a in Archive.objects.all():
year = arch.get(a.pub_date.year, {})
month = year.get(a.pub_date.month, [])
month.append(a)
year[a.pub_date.month] = month
arch[a.pub_date.year] = year
Ou pousser toute la logique de regroupement dans le modèle à l'aide regroup (non testé):
{% regroup archives by pub_date.year as year_list %}
{% for year in year_list %}
Year: {{ year.grouper }}
{% regroup year.list by pub_date.month as month_list %}
{% for month in month_list %}
Month: {{ month.grouper }}
{% for archive in month.list %}
{{ archive }}
{% endfor %}
{% endfor %}
{% endfor %}
Je voudrais essayer personnellement de mettre la logique dans la vue au lieu de dans le modèle.
Voici quelques messages connexes:
J'ai une idée de créer un nouveau champ à l'aide requête MySQL brut (smth comme YYYY_MM) et après cela, utilisez 'map' pour remplir la variable archives. –