DJANGO. Архив записей по месяцам через CONTEXT_PROCESSORS

Четверг, 30 Янв. 2014 by Kirill Shershen


Решил добавить боковую панель с архивом записей сгруппированных по месяцам за последний год. Для этого добавил новый контекстовый процессор month_list который будет возвращять список месяцев с количеством записей.  

Добавил файл context_processors.py в приложение, в нем описал функцию get_month_list():

from blog.models import Post
from calendar import month_name, monthrange
import time 
import datetime

def get_month_list(request):
    if not Post.publics.count():
        return []

    to_year, to_month = time.localtime()[:2]
    from_year = to_year - 1
    from_month = to_month
    months = []

    for y in range(to_year, from_year-1, -1):
        start, end = 12, 0
        if y == to_year: start = to_month
        if y == from_year: end = from_month-1

        for m in range(start, end, -1):
            ed = monthrange(y, m)[1]
            post_count = Post.publics.filter(created__range = (datetime.date(y,m,1),datetime.date(y,m,ed))).count()
            if post_count >= 1:
                months.append((y, m, month_name[m], post_count))

    return {'month_list': months}

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

На выходе массив записей вида (год, месяц, день, количество записей).

Алгоритм нашел где-то в интернете, подправил под свои нужды, теперь можно приступить к описанию шаблона.

<div class="bs-docs-sidebar">
    <ul class="nav nav-list bs-docs-sidenav">
    {% for month in month_list %}
    <li><a href="/blog/archives/{{ month.0 }}/{{ month.1 }}/"><i class="icon-chevron-right"></i>{{ month.0 }} {{ month.2 }} ({{ month.3 }})</a></li>
    {% endfor %}
    </ul>
</div>

Осталось добавить наш контекстовый процессор в настройки проекта и должно работать.

TEMPLATE_CONTEXT_PROCESSORS = (
    '...',
    'blog.context_processors.get_month_list',
    '...',
)

Теперь month_list будет доступен во всех шаблонах.

Теги: django , python


blog comments powered by Disqus