Көптеген блогтар мен жаңалықтар сайттарында аудиторияның назарын аудару үшін аптадағы ең танымал мақалалардың рейтингі, ұқсас жарияланымдар және кейбір үлкен ресурстар, сондай-ақ пайдаланушының қалауы бойынша ұсыныстар сияқты әдістер қолданылады. .
Ең алдымен танымал мақалалардың тізімін көрсету туралы шешім қабылданды. Танымал мақалалардың бірінші нұсқасы жалпы қарау санына негізделді және ең көп қаралған мақалаларға әкелді. Бұл әдетте жаман нұсқа, өйткені ТОП-та нәтижесінде барлық уақыттағы ең көп қаралған мақалалар болады.
Сондықтан бір нәрсені өзгерту керек болды. Нәтижесінде соңғы 7 күндегі танымал мақалаларды көрсету ең қарапайым нұсқада жүзеге асырылды. Яғни, күн бойынша мақаланы қарау саны енгізілген кесте қосылды. Әрине, ауыр жүктеме кезіндегі есептеулердің дәлдігі айтарлықтай өзгеруі мүмкін, бірақ трафик күніне 5 000 - 10 000 бірегей келушілерге жеткенше, бұл соншалықты маңызды емес.
Ал енді Django көмегімен танымал мақалалардың осындай тізімін жасаудың мысалын қарастырайық.
Үлгі мақалалар мен статистика
Мен мақалалар үшін үлгінің қысқартылған нұсқасын беремін, өйткені бұл жағдайда мені тек мақаланың тақырыбы қызықтырады.
class Article(models.Model): class Meta: db\_table = "article" title = models.CharField('Название статьи', max\_length=200) def \_\_str\_\_(self): return self.title
Ал мақала көрінісі статистикасының үлгісі үшін код келесідей болады.
class ArticleStatistic(models.Model): class Meta: db\_table = "ArticleStatistic" article = models.ForeignKey(Article) # внешний ключ на статью date = models.DateField('Дата', default=timezone.now) # дата views = models.IntegerField('Просмотры', default=0) # количество просмотров в эту дату def \_\_str\_\_(self): return self.article.title class ArticleStatisticAdmin(admin.ModelAdmin): list\_display = ('\_\_str\_\_', 'date', 'views') # отображаемые поля в админке search\_fields = ('\_\_str\_\_', ) # поле, по которому производится поиск
Бұл кодта екі модель бар:
- Статистиканы жинауға арналған модельдің өзі
- Басқару тақтасында деректерді көрсету үлгісі.
Бұл үлгілер models.py. файлында жазылады
Бұл үлгілерді admin.py. файлындағы әкімші панелінде тіркеуді ұмытпаңыз.
from django.contrib import admin from .models import Article, ArticleStatistic, ArticleStatisticAdmin admin.site.register(Article) admin.site.register(ArticleStatistic, ArticleStatisticAdmin)
Осыдан кейін дерекқорды тасымалдауды ұмытпаңыз.
python manage.db makemigrations python manage.db migrate
Бетті көрсету үшін көру
Үлгілерді қосқаннан кейін серверден мақаланы сұрау кезінде танымал мақалалардың шығысын қосу және статистиканы есептеу қалады.
from django.views import View from django.shortcuts import render\_to\_response, get\_object\_or\_404 from django.utils import timezone from django.db.models import Sum # Для работы с моделями статей у меня используется модуль knowledge from knowledge.models import Article, ArticleStatistic # тогда как для отображения статей используется модуль post # Это было сделано для того, чтобы URL статей был следующего вида # /post/42/ - где 42 - это id статьи в базе данных class EArticleView(View): template\_name = 'knowledge/article.html' # Шаблон статьи def get(self, request, *args, **kwargs): article = get\_object\_or\_404(Article, id=self.kwargs['article\_id']) # Забираем статью из базы данных context = {} # Далее забираем объект сегодняшней статистики или создаём новый, если требуется obj, created = ArticleStatistic.objects.get\_or\_create( defaults={ "article": article, "date": timezone.now() }, # При этом определяем, забор объекта статистики или его создание # по двум полям: дата и внешний ключ на статью date=timezone.now(), article=article ) obj.views += 1 # инкрементируем счётчик просмотров и обновляем поле в базе данных obj.save(update\_fields=['views']) # А теперь забираем список 5 последний самых популярных статей за неделю popular = ArticleStatistic.objects.filter( # отфильтровываем записи за последние 7 дней date\_\_range=[timezone.now() - timezone.timedelta(7), timezone.now()] ).values( # Забираем интересующие нас поля, а именно id и заголовок # К сожалению забрать объект по внешнему ключу в данном случае не получится # Только конкретные поля из объекта 'article\_id', 'article\_\_title' ).annotate( # Суммируем записи по просмотрам # Всё суммируется корректно с соответствием по запрашиваемым полям объектов views=Sum('views') ).order\_by( # отсортируем записи по убыванию '-views')[:5] # Заберём последние пять записей context['popular\_list'] = popular # Отправим в контекст список статей return render\_to\_response(template\_name=self.template\_name, context=context)
Үлгіде көрсету
Енді бет үлгісінде аптадағы танымал мақалалар тізімін көрсетіңіз. Мен тізімді көрсету үшін үлгіні ғана беремін деп ескертемін. Бұл беттегі мақалалар тізімін қалай көрсету керектігін түсіну үшін жеткілікті.
Мен django_bootstrap3 пайдаланып жатқанымды да ұмытпаңыз, сондықтан үлгі осылай көрінеді.
{% if popular\_list %}{% load bootstrap3 %} <ul class="list-group"> <li class="list-group-item active"><strong>Популярные публикации за неделю</strong></li> {% for pop\_article in popular\_list %} <li class="list-group-item"> <a href="{% url 'post:article' pop\_article.article\_id %}">{{ pop\_article.article\_\_title }}</a> </li> {% endfor %} </ul> {% endif %}
Өткізіп алмау үшін мен сайттан беттерді сұрауға арналған url үлгісін беремін:
url(r'^(?P<article\_id>[0-9]+)/$', views.EArticleView.as\_view(), name='article'),
Барлығы
Танымал мақалалар тізімі осы сайтта пайдаланылғанға ұқсас болады, тек жалпы қараулар саны жоқ, ал әкімші панелінде статистика келесідей болады:
Django үшін Timeweb хостының VDS-сервері ұсынамын.
Добрый день! В Django я новичок. По Вашей инструкции у меня получилось вывести популярные статьи, но они видны только в статье. Как вывести их на главную страницу? Заранее спасибо за ответ!
Я подумал, что этот вопрос можно рассмотреть немного подробнее, поэтому представил в виде отдельной статьи. Можете посмотреть вариант решения здесь: Вывод списка популярных статей на любой странице сайта
Спасибо Вам большое!!!
Добрый день!
Во-первых перепишите urlpatterns так
Во-вторых вы используете id, а там нужно тогда указать, что это у вас целочисленное значение, по умолчанию обрабатывается как строка. Значит результирующая запись будет такой.
К сожалению это не изменило ситуацию. Убираю ссылку на статью из шаблона и все работает. Вероятно не правильно сформирована ссылка в шаблоне.
Да. действительно, на это я не обратил внимания. Напишите либо так
И этот вариант к сожалению не рабочий =(
Извиняюсь, неправильно написал последний ответ. В рамках данной статьи это не правильно, у вас же во вьюшке формируется объект у которого в post_id должен содержаться его PrimaryKey.
Такая же как и у вас вроди бы.
мда... глупо как-то получилось. У вас же в шаблоне два аргумента задано.
Если делать таким образом, то вьюха отдает id категории а не slug. Попробую пост сделать отдельным приложением. Во всяком случае большое спасибо за помощь.
А. Так вы slug использовали? Тогда там надо брать поле slug из section в запросе.
Вот и я пришел к тому же пути. Так вроди бы логично и красиво выглядит.
Я как понял, этот метод создает статистику каждый день (на каждый день), не удаляя старые данные за день и выводит все данные за сегодняшние просмотры у всех статей?
Да, именно такой и была задумка
спасибо