Evgenii Legotckoi
5 января 2017 г. 18:47

Django - Урок 016. Вывод списка популярных статей на любой странице сайта

На сайте уже была статья о выводе списка популярных статей за последние 7 дней . Но в том варианте, который использован в данной статье, показано, как сделать вывод на странице со статьями. Но возник вопрос, как быстро внедрять список популярных статей на любую страницу сайта.

У себя я решил эту проблему с использованием собственного тега , который может быть использован в шаблоне Django. То есть, вместо того, чтобы в каждом View на сайте прописывать один и тот же код для получения списка статей или использования одной и той же функции в этих View, я просто сделал отдельный шаблон с уже готовой разметкой для списка популярных статей, в котором используется мой пользовательский тег, которым я забираю список этих статей. Таким образом, нужно только внедрять данный шаблон в нужном месте в шаблоне страницы с помощью тега include.


templatetags

Как уже говорилось, для статей я использовал модуль knowledge. В нём и создадим пользовательский тег. Для этого необходимо создать папку templatetags , а в ней два файла: init .py , knowledge_extras.py.

Далее в knowledge_extras.py прописываем выборку списка популярных статей за неделю.

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django import template
  4. from django.db.models import Sum
  5. from django.utils import timezone
  6.  
  7. from knowledge.models import ArticleStatistic
  8.  
  9. register = template.Library()
  10.  
  11.  
  12. @register.simple_tag
  13. def get_popular_articles_for_week():
  14.  
  15. popular = ArticleStatistic.objects.filter(
  16. # отфильтровываем записи за последние 7 дней
  17. date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]
  18. ).values(
  19. # Забираем интересующие нас поля, а именно id и заголовок
  20. # К сожалению забрать объект по внешнему ключу в данном случае не получится
  21. # Только конкретные поля из объекта
  22. 'article_id', 'article__title', 'article__views',
  23. ).annotate(
  24. # Суммируем записи по просмотрам
  25. sum_views=Sum('views')
  26. ).order_by(
  27.   # отсортируем записи по убыванию
  28. '-sum_views')[:5] # Заберём последние пять записей
  29.  
  30. return popular

popular.html

Далее напишем шаблон, где будет применяться этот тег с вёрсткой списка популярных статей за неделю.

  1. {% load knowledge_extras %}
  2. {% get_popular_articles_for_week as POPULAR_ARTICLES %}
  3. {% if POPULAR_ARTICLES %}
  4. {% load bootstrap3 %}
  5. <ul class="list-group">
  6. <li class="list-group-item active"><strong>Популярные публикации за неделю</strong></li>
  7. {% for article in POPULAR_ARTICLES %}
  8. <li class="list-group-item">
  9. <a href="{% url 'post:article' article.article_id %}">{{ article.article__title }}</a>
  10. </li>
  11. {% endfor %}
  12. </ul>
  13. {% endif %}

Использование шаблона

А для того, чтобы использовать данный шаблон, нужно просто добавить его с помощью тега include в то место в шаблоне главной страницы, шаблоне поиска, шаблоне статьи или ином шаблоне, где вы хотите видеть данный список популярных статей.

  1. {% include 'knowledge/popular.html' %}

Для Django рекомендую VDS-сервера хостера Timeweb .

Вам это нравится? Поделитесь в социальных сетях!

АЗ
  • 25 января 2017 г. 16:03

Евгений, день добрый. За что в вашем конкретном примере отвечает __init__.py?

Evgenii Legotckoi
  • 25 января 2017 г. 16:14

Андрей, добрый день.
Данный файл отвечает за то, чтобы каталог templatetags и его содержимое рассматривались в качестве отдельного пакета. Это указание по разработке из официальной документации Django.

ИМ
  • 1 февраля 2018 г. 4:59

У меня только так заработало.

def get_popular_movies_for_week():

    popular = MovieStatistic.objects.filter(
        date__range=[timezone.now() - timezone.timedelta(7), timezone.now()]
    ).values(
        'movie_id', 'movie__name'
    ).annotate(
        views=Sum('views')
    ).order_by(
        '-views')[:5]

    return popular
Спасибо за статью.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь