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