Django 博客开发教程 16 - 统计文章阅读量
2017-05-22 11:46
603 查看
如何精确地记录一篇文章的阅读量是一个比较复杂的问题,不过对于我们的博客来说,没有必要记录的那么精确。因此我们使用一种简单但有效的方式来记录博客文章的阅读量:文章每被浏览一次,则其阅读量 +1,即所谓的文章页面 PV(Page View)数。虽然简单粗暴,但却高效实用。
注意
你也许担心如果两个人同时访问一篇文章,更改数据库中的阅读量字段的值时会不会冲突?其实不必担心,我们本来就不是精确地统计阅读量,而且个人博客的流量通常也不会很大,所以偶尔的冲突导致的数据误差是可以忽略不计的。
关于数据库的迁移,具体可以参照 让 Django 完成翻译:迁移数据库模型。
即只需在视图函数中调用模型的
好了,这样当用户每访问一次文章详情,
如果遇到问题,请通过下面的方式寻求帮助。
在 统计文章阅读量 - 追梦人物的博客 评论区留言。
将问题的详细描述通过邮件发送到 djangostudyteam@163.com,一般会在 24 小时内回复。
更多Django 教程,请访问 追梦人物的博客。
增加新字段
为了记录文章的浏览量,需要在文章的数据库表中新增一个用于存储阅读量的字段。因此给博客文章的模型新增一个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 教程,请访问 追梦人物的博客。
相关文章推荐
- Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)
- 一步步开发自己的博客 番外篇(7、异步记录日志 和 文章阅读量统计)
- Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)
- Django 学习小组:博客开发实战第三周教程——文章列表分页和代码语法高亮
- Django开发博客(四)——建立文章列表
- Django 学习小组:博客开发实战第二周教程 —— 实现博客详情页面和分类页面
- Django 博客开发教程 13 - 已知小问题修正
- Django开发个人博客网站——21、实现博客的统计功能
- iOS开发学习资料大全--(视频/书籍/社区/工具/博客/文章/网站/教程/日报)
- Django开发博客(十四)—用户登录和站点统计
- Django 博客开发教程 12 - 评论
- Django 博客开发教程 10 - 页面侧边栏:使用自定义模板标签
- Django 学习小组:博客开发实战第四周——标签云与文章归档
- 使用Django1.7开发博客教程 - 目录汇总贴
- Django 博客开发教程 15 - 使用 Fabric 自动化部署
- 使用Django1.9开发博客教程 - 目录汇总贴
- Django开发博客(三)——在新的页面展示文章
- iOS开发学习资料大全--(视频/书籍/社区/工具/博客/文章/网站/教程/日报)
- Django 博客开发教程目录索引