Создание сайдбара для сайта Django 1.4

категория: Django
Итак, добрались до сайдбара для своего блога. Нужно ж выводить список категорий, тегов, последних статей и тд. Я решил использовать сustom template tags (https://docs.djangoproject.com/en/1.4/howto/custom-template-tags/). Почему именно тэги, а не контекстные процессоры? Разные дискуссии есть по этому поводу, можете почитать об этом на форумах. Примеры можно посмотреть в django/template/defaulttags.py. Начнем с создания каталога для своих тэгов в корне нашего аппа, должно получиться что-то вроде этого:
blog/
    models.py
    templatetags/
        __init__.py
        sidebar.py
    views.py
Собственные теги в шаблоне будем подгружать через тег {% load sidebar %}. В своем sidebar.py прописываем:
from django import template
from blog.models import Tag, Category, Post # импортируем модели
# экземпляр класса, в котором все наши теги будут зарегистрированы
register = template.Library() 
# регистрируем наш тег, который будет выводить шаблон right_sidebar.html
@register.inclusion_tag("right_sidebar.html")
def show_sidebar():
    tags = Tag.objects.all() # выбираем все теги
    # выбираем все категории
    categories = Category.objects.all().order_by("name")
    # выбираем все статьи по id - для ссылок и title - для списка 
    new_posts = Post.objects.values('id','title').order_by("-created")[:7]
    # возвращаем наши объекты в шаблон
    return {'tags': tags, 'categories': categories, 'new_posts': new_posts}
Далее создаем сам шаблон для отображения списка категорий, тэгов и последних добавленных статей "right_sidebar.html":
<ul>
   <li class="categories">
       <h2>Категории:</h2>
       <ul>
           {% for category in categories %}
           <li class="category">
              // выводим список ссылок на категории
              <a href="{% url url_category category.id%}">{{ category }}</a> 
           </li>
           {% endfor %}
       </ul>
   </li>
   ... // так же само для остального
</ul>
url_category - это именованная ссылка:
url(r'^category/(?P<id>\d+)$', 'category', name="url_category")
Все, теперь вставляем наш собственный тег show_sidebar в base.html, и он рендерит весь наш шаблон сайдбара right_sidebar.html:
<div class="sidebar">
    {% show_sidebar %} 
</div>
Все оказалось так просто, а так много времени у меня почему-то на это пошло, я даже не могу найти себе оправдания, но остались незабываемые впечатления)).


blog comments powered by Disqus