Сайтта соңғы 7 күндегі танымал мақалалар тізімі көрсету туралы мақала бұрыннан бар еді. Бірақ осы мақалада қолданылған нұсқада мақалалар бар бетте қорытынды жасау жолын көрсетеді. Бірақ сайттың кез келген бетіне танымал мақалалар тізімін қалай тез ендіру туралы сұрақ туындады.
Үйде мен бұл мәселені Django үлгісінде қолдануға болатын custom tag арқылы шештім. Яғни, мақалалар тізімін алу немесе осы Көріністерде бірдей функцияны пайдалану үшін сайттағы әрбір Көрініске бірдей кодты жазудың орнына, мен жай ғана өзімді пайдаланатын танымал мақалалар тізімі үшін дайын белгілеулері бар бөлек үлгі жасадым. Мен осы мақалалардың тізімін алатын теңшелетін тег. Осылайша, include. тегін пайдаланып, осы үлгіні бет үлгісінің дұрыс орнына ендіру керек.
үлгі тегтері
Жоғарыда айтылғандай, мақалалар үшін білім. модулін пайдаландым.Онда теңшелетін тег жасайық. Ол үшін 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
танымал.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 'knowledge/popular.html' %}
Django үшін Timeweb хостының VDS-сервері ұсынамын.
Евгений, день добрый. За что в вашем конкретном примере отвечает __init__.py?
Андрей, добрый день.
Данный файл отвечает за то, чтобы каталог templatetags и его содержимое рассматривались в качестве отдельного пакета. Это указание по разработке из официальной документации Django.
У меня только так заработало.