Этот вопрос возникает, как правило, довольно часто. Самое простое решение - пропустить данные и сгруппировать объекты по годам и месяцам. Вы можете сделать это вручную в представлении или используя regroup в своем шаблоне. Это зависит от того, что вы хотите делать с данными.
Если группировка архивов по годам и месяцам очень распространена для вашего приложения, вы можете захотеть создать поле года и месяца, которое вы заполняете в файле save().
Рукой это может быть что-то вроде этого:
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
Или толкая всю логику группирования в шаблон с помощью regroup (непроверенные):
{% 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 %}
Я бы лично попытаться поставить логику в представлении вместо шаблона.
Вот несколько связанных сообщений:
У меня есть идея создать новое поле, используя необработанный запрос MySQL (л как YYYY_MM) и после этого используйте 'map' для заполнения переменной архива. –