2010-10-04 4 views
0

Dans mon application de blogging, j'ai besoin d'une structure (créée comme une variable dans le processeur de contexte) qui va stocker mois et l'année correspondante de 5 mois consécutifs jusqu'à celui en cours. Donc, si le mois en cours est décembre, nous aurons l'année: 2010 et mois: 12,11,10,9,8. Si le mois sera janvier nous aurons des années 2010: mois: 1 et années: 2009 mois: 12, 11, 10, 9. Mon but est de montrer une archive sous la forme suivante:Créer et rendre la structure avec des années et des mois en django

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

Comment le créer et quelle structure dois-je utiliser? Et puis comment le montrer? Je pense que j'ai besoin d'une structure imbriquée mais qui pourra être rendue en django < 1.2?
Je l'ai commencé sur mon propre mais je me suis complètement perdu à un moment donné:

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] 

Répondre

2

Comment créer et quelle structure dois-je utiliser?

Je voudrais aller avec une liste de tuples année-mois. Voici un exemple d'implémentation. Vous aurez besoin de la bibliothèque pratique python-dateutil pour faire ce travail.

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

Et puis comment le montrer?

Voici une manière très simpliste de l'afficher. Je pense que vous pouvez le nettoyer en remplaçant les éléments <ul> par <div> et en les coiffant de manière appropriée.

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

previous_year_months est une variable de contexte correspondant au résultat retourné par get_current_and_5_previous_months.

Questions connexes