Архив списка с тегами шаблонов Django - PullRequest
0 голосов
/ 11 августа 2011

У меня есть приложение 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 . Архив будет в зеленой рамке в правом нижнем углу.

1 Ответ

0 голосов
/ 11 августа 2011

Нет необходимости возвращать что-то особенное.Django - это просто Python, так что это ваш выбор, который вы хотите вернуть.В этом случае я бы порекомендовал вернуть словарь вот так (просто придумывая) {{'title':'some title if you want','year': 'year if you want', 'url': url}, {...}, ...}.Затем в шаблоне вы просто запускаете как:

{% for entry in returned_dict %}
  <a href="{{ entry.url }}">{{ entry.title }}</a>
{% endfor %}

Также я бы рекомендовал не жестко кодировать ссылку на код.Прочитайте https://docs.djangoproject.com/en/dev/topics/http/urls/ о преобразователях URL, затем https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#url о теге шаблона {% url%}.Вы можете назвать URL-адреса, а затем вы можете получить URL-адреса для материала, который вы хотите, без жесткого кодирования в коде.Это поможет в будущем;)

Надеюсь, что помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...