Django 統計文章閱讀量(或熱度排名)
添加新字段
為了記錄文章的訪問量,需要在文章的數據庫表中新增一個用於存儲閱讀量的字段。
1 /models.py 2 3 class Post(models.Model): 4 #其它已有字段 5 #新添views字段記錄閱讀量 6 views = models.PositiveInterField(default=0)
註意 views 字段的類型為 PositiveInterField,該類型的值只允許為正整數或0,因為閱讀量不可能
為負數。初始化時views的值為0。
添加模型方法
一旦用戶訪問了某篇文章,只是就應該將views的值 +1,這個過程最好有post模型
自己來完成,因此再給模型添加一個自定義的方法:
1 /models.py 2 3 class Post(models.Model): 4 # ... 其它已有字段 5 # 新增 views 字段記錄閱讀量 6 views = models.PositiveIntegerField(default=0) 7 8 # ... 其它已有的模型方法 9 def increase_views(self): 10 self.views += 1 11 self.save(update_fields=[‘views‘])
increase_views
方法首先將自身對應的 views
字段的值 +1(此時數據庫中的值還沒變),
然後調用 save
方法將更改後的值保存到數據庫。註意這裏使用了 update_fields
參數
來告訴 Django 只更新數據庫中 views
字段的值,以提高效率。
你也許擔心如果兩個人同時訪問一篇文章,更改數據庫中的閱讀量字段的值時會不會沖突?
其實不必擔心,我們本來就不是精確地統計閱讀量,而且個人博客的流量通常也不會很大,
所以偶爾的沖突導致的數據誤差是可以忽略不計的。
修改視圖函數
當用戶請求訪問某篇文章時,處理該請求的視圖函數為 detail
說明文章被訪問了一次,因此我們修改 detail
視圖函數,讓被訪問的文章在視圖函數被
調用時閱讀量 +1。
1 blog/views.py 2 3 def detail(request, pk): 4 post = get_object_or_404(Post, pk=pk) 5 6 # 閱讀量 +1 7 post.increase_views() 8 9 post.body = markdown.markdown(post.body, 10 extensions=[ 11 ‘markdown.extensions.extra‘, 12 ‘markdown.extensions.codehilite‘, 13 ‘markdown.extensions.toc‘, 14 ]) 15 form = CommentForm() 16 comment_list = post.comment_set.all() 17 context = {‘post‘: post, 18 ‘form‘: form, 19 ‘comment_list‘: comment_list 20 } 21 return render(request, ‘blog/detail.html‘, context=context)
即只需在視圖函數中調用模型的 increase_views
方法即可。
設置熱門文章排名如下
1 def articlecont(request): 2 #文檔內容 3 #獲取顯示的文章id 4 nid = request.GET.get(‘nid‘) 5 #獲取文章 6 articledata = models.article.objects.filter(id=nid).first() 7 #獲取到的文章調用incease_views方法 8 models.article.increase_views(articledata) 9 #根據自增的views字段進行排序,並獲取最高的5條數據 10 hotdoc = models.article.objects.order_by("-views")[0:5] 11 return render(request, "articlecont.html", {"articledata": articledata,‘hotdoc‘:hotdoc})
模板中的操作
在模板中顯示閱讀量和顯示其它字段一樣,只需要使用模板變量即可。即模板適當的地方使用 {{ post.views }} 模板變量。這裏我們分別修改兩個地方,分別是 index.html 和 detail.html。
1 templates/blog/detail.html 2 3 <div class="entry-meta"> 4 ... 5 <span class="views-count"><a href="#">{{ post.views }} 閱讀</a></span> 6 </div>
好了,這樣當用戶每訪問一次文章詳情,views
記錄的數值就會 +1,從而達到粗略統計閱讀量的目的
Django 統計文章閱讀量(或熱度排名)