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 教程,请访问 追梦人物的博客

相关文章
相关标签/搜索