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