如何精確地記錄一篇文章的閱讀量是一個比較複雜的問題,不過對於我們的部落格來說,沒有必要記錄的那麼精確。因此我們使用一種簡單但有效的方式來記錄部落格文章的閱讀量:文章每被瀏覽一次,則其閱讀量 +1,即所謂的文章頁面 PV(Page View)數。雖然簡單粗暴,但卻高效實用。
增加新欄位
為了記錄文章的瀏覽量,需要在文章的資料庫表中新增一個用於儲存閱讀量的欄位。因此給部落格文章的模型新增一個 views
欄位:
blog/models.py
class Post(models.Model):
# ... 其它已有欄位
# 新增 views 欄位記錄閱讀量
views = models.PositiveIntegerField(default=0)複製程式碼
注意 views
欄位的型別為 PositiveIntegerField
,該型別的值只允許為正整數或 0,因為閱讀量不可能為負值。初始化時 views
的值為 0。
增加模型方法
一旦使用者訪問了某篇文章,這時就應該將 views
的值 +1,這個過程最好由 Post
模型自己來完成,因此再給模型新增一個自定義的方法:
blog/models.py
class Post(models.Model):
# ... 其它已有欄位
# 新增 views 欄位記錄閱讀量
views = models.PositiveIntegerField(default=0)
# ... 其它已有的模型方法
def increase_views(self):
self.views += 1
self.save(update_fields=[`views`])複製程式碼
increase_views
方法首先將自身對應的 views
欄位的值 +1(此時資料庫中的值還沒變),然後呼叫 save
方法將更改後的值儲存到資料庫。注意這裡使用了 update_fields
引數來告訴 Django 只更新資料庫中 views
欄位的值,以提高效率。
你也許擔心如果兩個人同時訪問一篇文章,更改資料庫中的閱讀量欄位的值時會不會衝突?其實不必擔心,我們本來就不是精確地統計閱讀量,而且個人部落格的流量通常也不會很大,所以偶爾的衝突導致的資料誤差是可以忽略不計的。
遷移資料庫
一旦更改了模型,就需要遷移資料庫,以便讓 Django 將更改反應到資料庫中。啟用虛擬環境,執行如下兩條命令:
python manage.py makemigrations
python manage.py migrate複製程式碼
關於資料庫的遷移,具體可以參照 讓 Django 完成翻譯:遷移資料庫模型。
修改檢視函式
當使用者請求訪問某篇文章時,處理該請求的檢視函式為 detail
。一旦該檢視函式被呼叫,說明文章被訪問了一次,因此我們修改 detail
檢視函式,讓被訪問的文章在檢視函式被呼叫時閱讀量 +1。
blog/views.py
def detail(request, pk):
post = get_object_or_404(Post, pk=pk)
# 閱讀量 +1
post.increase_views()
post.body = markdown.markdown(post.body,
extensions=[
`markdown.extensions.extra`,
`markdown.extensions.codehilite`,
`markdown.extensions.toc`,
])
form = CommentForm()
comment_list = post.comment_set.all()
context = {`post`: post,
`form`: form,
`comment_list`: comment_list
}
return render(request, `blog/detail.html`, context=context)複製程式碼
即只需在檢視函式中呼叫模型的 increase_views
方法即可。
在模板中顯示閱讀量
在模板中顯示閱讀量和顯示其它欄位一樣,只需要使用模板變數即可。即模板適當的地方使用 {{ post.views }} 模板變數。這裡我們分別修改兩個地方,分別是 index.html 和 detail.html。
templates/blog/index.html
<div class="entry-meta">
...
<span class="views-count"><a href="{{ post.get_absolute_url }}">{{ post.views }} 閱讀</a></span>
</div>複製程式碼
templates/blog/detail.html
<div class="entry-meta">
...
<span class="views-count"><a href="#">{{ post.views }} 閱讀</a></span>
</div>複製程式碼
好了,這樣當使用者每訪問一次文章詳情,views
記錄的數值就會 +1,從而達到粗略統計閱讀量的目的。
總結
本章節的程式碼位於:Step16: record post views。
如果遇到問題,請通過下面的方式尋求幫助。
- 在 統計文章閱讀量 – 追夢人物的部落格 評論區留言。
- 將問題的詳細描述通過郵件傳送到 djangostudyteam@163.com,一般會在 24 小時內回覆。
更多Django 教程,請訪問 追夢人物的部落格。