На сайте уже была статья о выводе списка популярных статей за последние 7 дней . Но в том варианте, который использован в данной статье, показано, как сделать вывод на странице со статьями. Но возник вопрос, как быстро внедрять список популярных статей на любую страницу сайта.
У себя я решил эту проблему с использованием собственного тега , который может быть использован в шаблоне Django. То есть, вместо того, чтобы в каждом View на сайте прописывать один и тот же код для получения списка статей или использования одной и той же функции в этих View, я просто сделал отдельный шаблон с уже готовой разметкой для списка популярных статей, в котором используется мой пользовательский тег, которым я забираю список этих статей. Таким образом, нужно только внедрять данный шаблон в нужном месте в шаблоне страницы с помощью тега include.
templatetags
Как уже говорилось, для статей я использовал модуль knowledge. В нём и создадим пользовательский тег. Для этого необходимо создать папку templatetags , а в ней два файла: init .py , knowledge_extras.py.
Далее в knowledge_extras.py прописываем выборку списка популярных статей за неделю.
- # -*- coding: utf-8 -*-
- from django import template
- from django.db.models import Sum
- from django.utils import timezone
- from knowledge.models import ArticleStatistic
- register = template.Library()
- @register.simple_tag
- def get_popular_articles_for_week():
- popular = ArticleStatistic.objects.filter(
- # отфильтровываем записи за последние 7 дней
- date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]
- ).values(
- # Забираем интересующие нас поля, а именно id и заголовок
- # К сожалению забрать объект по внешнему ключу в данном случае не получится
- # Только конкретные поля из объекта
- 'article_id', 'article__title', 'article__views',
- ).annotate(
- # Суммируем записи по просмотрам
- sum_views=Sum('views')
- ).order_by(
- # отсортируем записи по убыванию
- '-sum_views')[:5] # Заберём последние пять записей
- return popular
popular.html
Далее напишем шаблон, где будет применяться этот тег с вёрсткой списка популярных статей за неделю.
- {% load knowledge_extras %}
- {% get_popular_articles_for_week as POPULAR_ARTICLES %}
- {% if POPULAR_ARTICLES %}
- {% load bootstrap3 %}
- <ul class="list-group">
- <li class="list-group-item active"><strong>Популярные публикации за неделю</strong></li>
- {% for article in POPULAR_ARTICLES %}
- <li class="list-group-item">
- <a href="{% url 'post:article' article.article_id %}">{{ article.article__title }}</a>
- </li>
- {% endfor %}
- </ul>
- {% endif %}
Использование шаблона
А для того, чтобы использовать данный шаблон, нужно просто добавить его с помощью тега include в то место в шаблоне главной страницы, шаблоне поиска, шаблоне статьи или ином шаблоне, где вы хотите видеть данный список популярных статей.
- {% include 'knowledge/popular.html' %}
Для Django рекомендую VDS-сервера хостера Timeweb .
Евгений, день добрый. За что в вашем конкретном примере отвечает __init__.py?
Андрей, добрый день.
Данный файл отвечает за то, чтобы каталог templatetags и его содержимое рассматривались в качестве отдельного пакета. Это указание по разработке из официальной документации Django.
У меня только так заработало.