Создание и рендеринг структуры с годами и месяцами в Джанго - PullRequest
0 голосов
/ 04 октября 2010

В моем приложении для ведения блога мне нужна структура (созданная как переменная в контекстном процессоре), в которой будет храниться номер месяца и соответствующий год от 5 последовательных месяцев до текущего.Таким образом, если текущий месяц декабрь, у нас будет год: 2010 и месяцы: 12,11,10,9,8.Если месяц будет январь, у нас будут годы 2010: месяцы: 1 и годы: 2009 месяцы: 12, 11, 10, 9.Моя цель - показать архив в следующем виде:

- 2010
    - January
- 2009
    - December
    - November
    - October
    - September

Как его создать и какую структуру использовать?И как тогда это показать?Я думаю, что мне нужна некоторая вложенная структура, но которую можно будет визуализировать в django <1.2? <br>Я запустил ее самостоятельно, но в какой-то момент полностью потерял:

now = datetime.datetime.now()

years = []
months = []
archive = []
if now.month in range(5, 12, 1):
    months = range(now.month, now.month-5, -1)        
    if months:
        years = now.year
else:
    diff = 5 - now.month
    for i in range(1, now.month, 1):
        archive.append({
                        "month": i,
                        "year": now.year,
        })

    for i in range(0, diff, 1):
        tmpMonth = 12 - int(i)
        archive.append({
                        "month": tmpMonth,
                        "year": now.year-1,
        })

    if archive:
        years = [now.year, now.year-1]

1 Ответ

2 голосов
/ 04 октября 2010

Как его создать и какую структуру использовать?

Я бы пошел со списком кортежей год-месяц. Вот пример реализации. Для этой работы вам понадобится удобная библиотека python-dateutil .

from datetime import datetime
from dateutil.relativedelta import relativedelta

def get_5_previous_year_months(a_day):
    """Returns a list of year, month tuples for the current and previous 
    5 months relative to a_day"""
    current_year, current_month = a_day.year, a_day.month
    first_of_month = datetime(current_year, current_month, 1)
    previous_months = (first_of_month - relativedelta(months = months)
            for months in range(0, 5))
    return ((pm.year, pm.month) for pm in previous_months) 

def get_current_and_5_previous_months():
    return get_5_previous_year_months(datetime.today())

А как это показать?

Вот очень упрощенный способ показать это. Я думаю, что вы можете очистить его, заменив элементы <ul> на <div> и применив соответствующий стиль.

    <ul>
    {% for year, month in previous_year_months %}
        {% ifchanged year %}
            </ul><li>{{ year }}</li><ul>
        {% endifchanged %}
                <li>{{ month }}</li>
    {% endfor %}
    </ul>

Где previous_year_months - переменная контекста, соответствующая результату, возвращаемому get_current_and_5_previous_months.

...