From 7ab0f6ee2498392a9a4ddb42f0d3fbcb5f98afa3 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Fri, 14 Aug 2020 22:06:38 +0200 Subject: [PATCH] Add a views count on article Incremented by non logged in visitors --- articles/admin.py | 8 ++++---- .../migrations/0004_article_views_count.py | 18 ++++++++++++++++++ articles/models.py | 1 + articles/views.py | 9 +++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 articles/migrations/0004_article_views_count.py diff --git a/articles/admin.py b/articles/admin.py index 78cfcd3..2402043 100644 --- a/articles/admin.py +++ b/articles/admin.py @@ -26,12 +26,12 @@ class ArticleAdmin(admin.ModelAdmin): { "fields": ( "title", - "status", - ("created_at", "published_at", "updated_at"), - "author", + ("author", "status"), + ("published_at", "created_at", "updated_at"), + "views_count", ) }, ), ("Content", {"fields": ("content",)}), ] - readonly_fields = ["created_at", "updated_at"] + readonly_fields = ["created_at", "updated_at", "views_count"] diff --git a/articles/migrations/0004_article_views_count.py b/articles/migrations/0004_article_views_count.py new file mode 100644 index 0000000..0522568 --- /dev/null +++ b/articles/migrations/0004_article_views_count.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-08-14 20:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("articles", "0003_auto_20200814_1522"), + ] + + operations = [ + migrations.AddField( + model_name="article", + name="views_count", + field=models.IntegerField(default=0), + ), + ] diff --git a/articles/models.py b/articles/models.py index 7154c03..4c466bb 100644 --- a/articles/models.py +++ b/articles/models.py @@ -23,6 +23,7 @@ class Article(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) author = models.ForeignKey(User, on_delete=models.PROTECT) + views_count = models.IntegerField(default=0) class Meta: ordering = ["-published_at"] diff --git a/articles/views.py b/articles/views.py index f138c99..300ae55 100644 --- a/articles/views.py +++ b/articles/views.py @@ -1,3 +1,4 @@ +from django.db.models import F from django.views import generic from articles.models import Article @@ -18,3 +19,11 @@ class ArticleDetailView(generic.DetailView): def get_queryset(self): return super().get_queryset().filter(status=Article.PUBLISHED) + + def get_object(self, queryset=None): + obj = super().get_object(queryset) + if not self.request.user.is_authenticated: + obj.views_count = F("views_count") + 1 + obj.save(update_fields=["views_count"]) + + return obj