16 - 統計文章閱讀量

如何精確地記錄一篇文章的閱讀量是一個比較複雜的問題,不過對於咱們的博客來講,沒有必要記錄的那麼精確。所以咱們使用一種簡單但有效的方式來記錄博客文章的閱讀量:文章每被瀏覽一次,則其閱讀量 +1,即所謂的文章頁面 PV(Page View)數。雖然簡單粗暴,但卻高效實用。javascript

增長新字段

爲了記錄文章的瀏覽量,須要在文章的數據庫表中新增一個用於存儲閱讀量的字段。所以給博客文章的模型新增一個 views 字段:html

blog/models.py

class Post(models.Model):
    # ... 其它已有字段
    # 新增 views 字段記錄閱讀量
    views = models.PositiveIntegerField(default=0)複製代碼

注意 views 字段的類型爲 PositiveIntegerField,該類型的值只容許爲正整數或 0,由於閱讀量不可能爲負值。初始化時 views 的值爲 0。java

增長模型方法

一旦用戶訪問了某篇文章,這時就應該將 views 的值 +1,這個過程最好由 Post 模型本身來完成,所以再給模型添加一個自定義的方法:python

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 字段的值,以提升效率。git

你也許擔憂若是兩我的同時訪問一篇文章,更改數據庫中的閱讀量字段的值時會不會衝突?其實沒必要擔憂,咱們原本就不是精確地統計閱讀量,並且我的博客的流量一般也不會很大,因此偶爾的衝突致使的數據偏差是能夠忽略不計的。github

遷移數據庫

一旦更改了模型,就須要遷移數據庫,以便讓 Django 將更改反應到數據庫中。激活虛擬環境,運行以下兩條命令:數據庫

python manage.py makemigrations
python manage.py migrate複製代碼

關於數據庫的遷移,具體能夠參照 讓 Django 完成翻譯:遷移數據庫模型django

修改視圖函數

當用戶請求訪問某篇文章時,處理該請求的視圖函數爲 detail 。一旦該視圖函數被調用,說明文章被訪問了一次,所以咱們修改 detail 視圖函數,讓被訪問的文章在視圖函數被調用時閱讀量 +1。markdown

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

若是遇到問題,請經過下面的方式尋求幫助。

更多Django 教程,請訪問 追夢人物的博客

相關文章
相關標籤/搜索