在django中创建和渲染具有数年和数月的结构

时间:2010-10-04 01:08:37

标签: python django django-templates python-datetime

在我的博客应用程序中,我需要一个结构(在上下文处理器中创建为变量),它将存储月份数和相应的连续5个月直到当前的月份。因此,如果当前月份是12月,我们将有年份:2010年和月份:12,11,10,9,8。如果月份将是1月,我们将有2010年:月:1年:2009年:12,11,10,9。我的目标是以下列形式显示档案:

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

如何创建它以及我应该使用什么结构?然后如何展示它?我想我需要一些嵌套结构,但可以在django<中进行渲染。 1.2?
我是自己开始的,但在某些时候完全迷失了:

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 个答案:

答案 0 :(得分:2)

  

如何创建它以及我应该使用什么结构?

我会列出一年一月的元组列表。这是一个示例实现。您需要方便的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返回的结果对应的上下文变量。