Viele Blogs und Nachrichtenseiten verwenden Techniken wie die Bewertung beliebter Artikel der Woche, verwandte Veröffentlichungen und einige umfangreiche Ressourcen verwenden auch Empfehlungen zu Benutzerpräferenzen, um die Aufmerksamkeit des Publikums zu erhalten.
Als erstes wurde beschlossen, eine Liste beliebter Artikel anzuzeigen. Der erste Entwurf von Popular Articles basierte auf der Gesamtanzahl der Aufrufe und zeigte schließlich die Artikel mit der höchsten Anzahl von Aufrufen. Dies ist im Allgemeinen eine schlechte Option, da es in der TOP-Liste daher Artikel geben wird, die einfach die höchste Anzahl an Aufrufen aller Zeiten erzielt haben.
Daher musste etwas geändert werden. Als Ergebnis wurde die Anzeige der beliebten Artikel der letzten 7 Tage in der einfachsten Version implementiert. Das heißt, es wurde eine Tabelle hinzugefügt, in die die Anzahl der Artikelansichten pro Tag eingetragen wird. Natürlich kann die Genauigkeit von Berechnungen unter hoher Last stark schwanken, aber bis die Besucherzahl 5.000 - 10.000 Unique Visitors pro Tag erreicht hat, ist dies nicht so wichtig.
Schauen wir uns nun ein Beispiel an, wie man mit Django eine solche Liste beliebter Artikel erstellt.
Artikel- und Statistikmodelle
Bei Artikeln werde ich eine abgespeckte Version des Modells angeben, da mich in diesem Fall nur der Titel des Artikels interessiert.
class Article(models.Model): class Meta: db_table = "article" title = models.CharField('Название статьи', max_length=200) def __str__(self): return self.title
Und für das Modell der Ansichtsstatistik nach Artikeln sieht der Code wie folgt aus.
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__', ) # поле, по которому производится поиск
In diesem Code werden zwei Modelle erstellt:
- Das Modell selbst zum Sammeln von Statistiken
- Modell zur Anzeige von Daten im Admin-Panel.
Diese Modelle werden in models.py geschrieben.
Vergessen Sie nicht, diese Modelle im Admin-Panel in der Datei admin.py zu registrieren.
from django.contrib import admin from .models import Article, ArticleStatistic, ArticleStatisticAdmin admin.site.register(Article) admin.site.register(ArticleStatistic, ArticleStatisticAdmin)
Vergessen Sie danach nicht, die Datenbank zu migrieren.
python manage.db makemigrations python manage.db migrate
View, um die Seite anzuzeigen
Nachdem wir die Modelle hinzugefügt haben, müssen wir nur noch die Ausgabe beliebter Artikel hinzufügen und Statistiken berechnen, wenn ein Artikel vom Server angefordert wird.
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)
In Vorlage anzeigen
Nun, lassen Sie uns jetzt einfach die Liste der beliebten Artikel für die Woche in der Seitenvorlage anzeigen. Ich werde reservieren, dass ich nur eine Vorlage für die Anzeige der Liste gebe. Dies reicht aus, um zu verstehen, wie eine Liste von Artikeln auf einer Seite angezeigt wird.
Vergessen Sie auch nicht, dass ich django \ _bootstrap3 verwende, damit die Vorlage so aussieht.
{% 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 %}
Um Missverständnisse zu vermeiden, gebe ich eine URL-Vorlage zum Anfordern von Seiten von der Site:
url(r'^(?P<article_id>[0-9]+)/$', views.EArticleView.as_view(), name='article'),
Ergebnis
Die Liste der beliebten Artikel ähnelt der auf dieser Site verwendeten, nur ohne die Gesamtzahl der Aufrufe, und im Admin-Panel sieht die Statistik wie folgt aus:
Für Django empfehle ich Timeweb VDS-Server .
Добрый день! В Django я новичок. По Вашей инструкции у меня получилось вывести популярные статьи, но они видны только в статье. Как вывести их на главную страницу? Заранее спасибо за ответ!
Я подумал, что этот вопрос можно рассмотреть немного подробнее, поэтому представил в виде отдельной статьи. Можете посмотреть вариант решения здесь: Вывод списка популярных статей на любой странице сайта
Спасибо Вам большое!!!
Добрый день!
Во-первых перепишите urlpatterns так
Во-вторых вы используете id, а там нужно тогда указать, что это у вас целочисленное значение, по умолчанию обрабатывается как строка. Значит результирующая запись будет такой.
К сожалению это не изменило ситуацию. Убираю ссылку на статью из шаблона и все работает. Вероятно не правильно сформирована ссылка в шаблоне.
Да. действительно, на это я не обратил внимания. Напишите либо так
И этот вариант к сожалению не рабочий =(
Извиняюсь, неправильно написал последний ответ. В рамках данной статьи это не правильно, у вас же во вьюшке формируется объект у которого в post_id должен содержаться его PrimaryKey.
Такая же как и у вас вроди бы.
мда... глупо как-то получилось. У вас же в шаблоне два аргумента задано.
Если делать таким образом, то вьюха отдает id категории а не slug. Попробую пост сделать отдельным приложением. Во всяком случае большое спасибо за помощь.
А. Так вы slug использовали? Тогда там надо брать поле slug из section в запросе.
Вот и я пришел к тому же пути. Так вроди бы логично и красиво выглядит.
Я как понял, этот метод создает статистику каждый день (на каждый день), не удаляя старые данные за день и выводит все данные за сегодняшние просмотры у всех статей?
Да, именно такой и была задумка
спасибо