1. 程式人生 > >Django 統計文章閱讀量(或熱度排名)

Django 統計文章閱讀量(或熱度排名)

pla djang turn 同時 end lds ext 需要 pan

添加新字段

為了記錄文章的訪問量,需要在文章的數據庫表中新增一個用於存儲閱讀量的字段。

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 統計文章閱讀量(或熱度排名)