Список записей блога по годам, месяцам

Я хочу сделать что-то вроде этого:

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

но эта строка недействительна. Как я могу перечислить записи в блоге по годам, месяцам и отобразить их в шаблоне?

Спасибо!


person Matthew    schedule 21.11.2009    source источник


Ответы (4)


Если вы установите

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

по вашему мнению, вы можете отображать месяцы и годы в шаблоне, используя тег шаблона 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 %}

Другой полезный метод набора запросов Django для архивов блогов — даты.

Например

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

возвращает DateQuerySet из datetime.datetime объектов для каждого месяца, в котором есть записи в блоге. Этот набор запросов можно использовать в шаблоне для создания ссылок на ежемесячные архивные страницы.

person Alasdair    schedule 21.11.2009

Вы можете попробовать использовать встроенный тег перегруппировки.

На ваш взгляд:

archives = Entries.objects.all()

В вашем шаблоне:

{% 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 %}
person kemar    schedule 21.11.2009

Вот фрагмент кода из моего блога, где я перечисляю все записи блога за определенный год:

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

В приведенном выше:

  • drafts — это логическое значение, которое указывает, показывать ли завершенные элементы или нет.
  • year - выбранный год
  • order_by - это имя столбца порядка.

Вы должны быть в состоянии легко изменить этот пример, чтобы также включить месяц. Выше показано, что вы можете комбинировать несколько фильтров подряд.

person Brian R. Bondy    schedule 21.11.2009

Хорошо, давайте попробуем сделать тяжелую работу в структуре данных, а не в шаблонах.

Создадим утилиту.

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

Воспользуемся утилитой здесь.

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

В результате получился хороший словарь с годами и месяцами в качестве ключей:

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

которые вы можете красиво показать в шаблонах

person chhantyal    schedule 17.07.2013