さらにスマートなクリック回数カウント
前回の記事でDjangoのバックエンドでの表示回数のカウントの仕方について記事を執筆させていただきましたが、今回、さらに短いコーディングでバックエンドでのクリック回数カウントのやり方を見つけ出しましたので記事にすることにしました。
1.models.py
まずはmodels.pyです。こちらから大きく書き方が違ってきます。
記事
class Post(models.Model):
user = models.ForeignKey(User, verbose_name='投稿者', on_delete=models.CASCADE)
title = models.CharField(verbose_name='タイトル', max_length=40)
content = models.TextField(verbose_name='本文')
img = models.ImageField(blank=True, null=True)
views = models.IntegerField(default=0) # 変更点
created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True)
今回もモデルの定義は適当です。前回の記事との相違点は新たにviewsというテーブルを用意したことと、カウント用に用意していたViewクラスを削除したことです。クリック回数のカウントをした後の結果はPostモデルのviewsテーブルに格納されることになります。
2.views.py
次にviews.pyです。こちらも前回の記事と比較しますとかなりスマートな書き方になります。
from django.views import generic
from .models import Post
# 記事の一覧表示
class PostListView(LoginRequiredMixin, generic.ListView):
model = Post
template_name = 'index.html'
context_object_name = 'post_list'
def getqueryset(self):
posts = Post.objects.all().order_by('-created_at')
return posts
# 記事の詳細へ移動
class PostDetailView(LoginRequiredMixin, generic.DetailView):
model = Post
template_name = 'post_detail.html'
# 記事の表示回数をカウント(主にここを変更)
def add_count(request, pk):
count = Post.objects.get(pk=pk) # カウントを加算する記事を取得
count.views += 1 # 記事が持つviews要素を1増やす
count.save() # 保存
return redirect('post_detail', pk=count.pk)
ご覧の通り、以前の記事よりもカウント処理をする関数の行数が少なくなりました。データベースのカウントを増やした後で記事詳細画面へと移動するロジックについては前回の記事と変わっていません。
3.urls.py
こちらも一応掲載しておきますが以前と変わらずです。
from django.urls import path
from . import views
urlpatterns = [
path('', views.PostListView.as_view(), name='index'),
path('post_detail/', views.PostDetailView().as_view(), name='post_detail'),
path('add_count/', views.add_count, name='add_count'),
]
あとはテンプレートとなるHTMLファイルですが、前回の記事と変更はありません。ですので、HTMLファイルについてですが、変更点はほぼありません。強いて言うなら{{ items.number_of_views }}と記述していた箇所を{{ items.views }}と書き換える程度です。ですので、こちらのテンプレートをご参照いただき、該当箇所を上記のように書き換えていただければと思います。
今回の記事は以上になります。以前よりかはコードが短くなっていますので多少はコーディング時間の短縮になるかと思います。参考になりましたら是非ともご活用いただければ幸いです。