Evgenii Legotckoi
Evgenii Legotckoi05 січня 2017 р. 07:47

Django - Підручник 016. Відображає список популярних статей на будь-якій сторінці сайту

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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

АЗ
  • 25 січня 2017 р. 05:03

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

Evgenii Legotckoi
  • 25 січня 2017 р. 05:14

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

ИМ
  • 31 січня 2018 р. 17: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
Спасибо за статью.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах