2010-10-04 37 views
0

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

- 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] 

回答

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()) 

再怎么表现呢?

这是一个非常简单的方式来显示它。我认为你可以通过用<div>替换<ul>元素并对其进行适当的样式来清理它。

<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返回的结果的上下文变量。