文章目錄
- 0.models中增加新字段
- 1.models中增加方法
- 2.遷移數據庫
- 3.修改視圖函數
- 4.在模板中顯示閱讀量
0.models中增加新字段
為了記錄文章的瀏覽量,需要在文章的數據庫表中新增一個用于存儲閱讀量的字段。
文件位置:blog/models.py
class Post(models.Model):# ... 其它已有字段# 新增 views 字段記錄閱讀量views = models.PositiveIntegerField(default=0, editable=False)
注意:
1)views 字段的類型為 PositiveIntegerField,該類型的值只允許為正整數或 0,因為閱讀量不可能為負值。
2)初始化時 views 的值為 0。
3)將 editable 參數設為 False 將不允許通過 django admin 后臺編輯此字段的內容。因為閱讀量應該根據被訪問次數統計,而不應該人為修改。
1.models中增加方法
當用戶訪問了某篇文章,這時就應該將 views 的值 +1,這個過程最好由 Post 模型自己來完成,因此再給模型添加一個自定義的方法:
文件位置:blog/models.py
class Post(models.Model):# ... 其它已有字段# 新增 views 字段記錄閱讀量views = models.PositiveIntegerField(default=0)# ... 其它已有的模型方法def increase_views(self):self.views += 1self.save(update_fields=['views'])
注意:
1)increase_views 方法首先將自身對應的 views 字段的值 +1(此時數據庫中的值還沒變);
2)然后調用 save 方法將更改后的值保存到數據庫。
3)注意這里使用了 update_fields 參數來告訴 Django 只更新數據庫中 views 字段的值,以提高效率。
2.遷移數據庫
一旦更改了模型,就需要遷移數據庫,以便讓 Django 將更改反應到數據庫中。在項目根目錄運行如下兩條命令:
$ pipenv run python manage.py makemigrations
$ pipenv run python manage.py migrate
3.修改視圖函數
當用戶請求訪問某篇文章時,處理該請求的視圖函數為 detail 。
一旦該視圖函數被調用,說明文章被訪問了一次,因此我們修改 detail 視圖函數,讓被訪問的文章在視圖函數被調用時閱讀量 +1。
即只需在視圖函數中調用模型的 increase_views 方法即可。
文件位置:blog/views.py
def detail(request, pk):post = get_object_or_404(Post, pk=pk)# 閱讀量 +1post.increase_views()md = markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite',# 記得在頂部引入 TocExtension 和 slugifyTocExtension(slugify=slugify),])post.body = md.convert(post.body)m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)post.toc = m.group(1) if m is not None else ''return render(request, 'blog/detail.html', context={'post': post})
4.在模板中顯示閱讀量
在模板中顯示閱讀量和顯示其它字段一樣,只需要使用模板變量即可。即模板適當的地方使用 {{ 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,從而達到粗略統計閱讀量的目的。