У меня есть приложение django, блог. Доступ к записям в блоге можно получить через шаблон URL / год / месяц / день / слаг, он работает нормально.
Моя проблема в том, что я хочу, чтобы список архивов был доступен для любого шаблона на моем сайте. Поэтому я подумал, что лучшим решением будет создание тега шаблона, который будет создавать и возвращать нужную мне информацию.
Я хотел, чтобы формат архива был таким:
August 2011
July 2011
etc..
2010
2009
2008
etc..
Так показывают только месяцы за текущий год.
Это тег, который я придумал:
from django.template import Library, Node, TemplateSyntaxError
from core.blog.models import Entry
import datetime, calendar
register = Library()
class ArchiveNode(Node):
def __init__(self, varname):
self.varname = varname
def render(self, context):
temp = list()
#Get Info about the first post
first = Entry.objects.order_by("pub_date")[0]
first_year = first.pub_date.year
first_month = first.pub_date.month
#Loop over years and months since first post was created
today = datetime.datetime.today()
this_year = today.year
this_month = today.month
for year in range(this_year - first_year):
if year != this_year:
temp += (year,'/blog/'+year+'/')
else:
for month in range(this_month - first_month):
month_name = calendar.month_name[month]
temp += (month_name+" "+year,'/blog/'+year+'/'+month+'/')
context[self.varname] = temp.reverse()
return ''
@register.tag
def get_archive(parser, token):
bits = token.contents.split()
if len(bits) != 3:
raise TemplateSyntaxError, "get_archive tag takes exactly 1 argument"
if bits[1] != 'as':
raise TemplateSyntaxError, "second argument to get_archive tag must be 'as'"
return ArchiveNode(bits[2])
Как вы видите, я возвращаю список кортежей, содержащий имя и URL.
Будет ли это действительно в Джанго? или мне нужно упаковать информацию в какой-нибудь контейнер django? (Кажется, он ничего не возвращает)
Это сайт, над которым я работаю ctrl-dev.com / blog .
Архив будет в зеленой рамке в правом нижнем углу.