当前位置: 首页 > news >正文

Django 博客开发教程 16 - 统计文章阅读量

如何精确地记录一篇文章的阅读量是一个比较复杂的问题,不过对于我们的博客来说,没有必要记录的那么精确。因此我们使用一种简单但有效的方式来记录博客文章的阅读量:文章每被浏览一次,则其阅读量 +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 教程,请访问 追梦人物的博客。

相关文章:

  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • maven编译的时候排除junit测试类
  • TortioseSVN切换账号教程
  • PHP变量
  • Jenkins进阶系列之——04Publish Over FTP Plugin插件
  • HashMap的长度为什么要是2的n次方
  • mysql主从复制配置过程及演示
  • [坑]解决Spring利用注解@Value获取properties属性为null或@Autowired 注解为null
  • 如何让git小乌龟工具TortoiseGit记住你的账号密码
  • POJ3013 Big Christmas Tree
  • 飘逸的python - 实现一个极简的优先队列
  • Linux常用查找命令
  • 留存- angularjs 弹出框 $modal
  • 矩阵相乘,向量相乘,矩阵向量相乘
  • Spring中基于Java的配置@Configuration和@Bean用法
  • [PHP内核探索]PHP中的哈希表
  • es6要点
  • October CMS - 快速入门 9 Images And Galleries
  • 离散点最小(凸)包围边界查找
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前言-如何学习区块链
  • 区块链分支循环
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (循环依赖问题)学习spring的第九天
  • (转)Linq学习笔记
  • .NET Core 项目指定SDK版本
  • .net 托管代码与非托管代码
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net的socket示例
  • .NET的数据绑定
  • .NET中的Exception处理(C#)
  • /bin/rm: 参数列表过长"的解决办法
  • @javax.ws.rs Webservice注解
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @Transaction注解失效的几种场景(附有示例代码)
  • @我的前任是个极品 微博分析
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [C++]priority_queue的介绍及模拟实现
  • [Gym-102091E] How Many Groups
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [Hive] 常见函数
  • [HJ56 完全数计算]
  • [JavaWeb学习] idea新建web项目
  • [leetcode] 3Sum
  • [linux c]linux do_div() 函数用法
  • [Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件
  • [moka同学笔记]yii表单dropdownlist样式
  • [No000016]为什么假期计划总是做不到?
  • [python]基于opencv实现的车道线检测
  • [python-opencv] PNG 裁切物体
  • [Python设计模式] 第27章 正则表达式——解释器模式
  • [Samba] 一路走来
  • [Step By Step]SAP HANA创建属性视图(Attribute View)