本文使用一种简单的方法来记录博客文章的阅读量。文章每被浏览一次,则其阅读量 +1,即所谓的文章页面 PV(Page View)数。
增加新字段
为了记录文章的浏览量,需要在文章的数据库表中新增一个用于存储阅读量的字段。因此修改博客文章的模型为:
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()
md = markdown.Markdown(extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
TocExtension(slugify=slugify)
])
post.body = md.convert(post.body)
form = CommentForm()
comment_list = post.comment_set.all()
context = {'post': post,
'toc': md.toc,
'form': form,
'comment_list': comment_list
}
return render(request, 'blog/detail.html', context=context)
即只需在视图函数中调用模型的 increase_views
方法即可。
在模板中显示阅读量
在模板中显示阅读量和显示其它字段一样,只需要使用模板变量即可。即模板适当的地方使用 {{ post.views }} 模板变量。
-- EOF --
不错