На сайті вже була стаття про виведення списку популярних статей за останні 7 днів . Але у тому варіанті, який використаний у цій статті, показано, як зробити висновок на сторінці зі статтями. Але постало питання, як швидко впроваджувати список популярних статей на будь-яку сторінку сайту.
Я вирішив цю проблему з використанням власного тега , який може бути використаний у шаблоні Django. Тобто, замість того, щоб у кожному View на сайті прописувати один і той же код для отримання списку статей або використання однієї й тієї ж функції в цих View, я просто зробив окремий шаблон з готовою розміткою для списку популярних статей, в якому використовується мій тег, яким я забираю список цих статей. Таким чином, потрібно лише впроваджувати цей шаблон у потрібному місці у шаблоні сторінки за допомогою тега include.
теги шаблонів
Як уже говорилося, для статей я використав модуль 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.
У меня только так заработало.