Django 博客统计文章阅读量

本文使用一种简单的方法来记录博客文章的阅读量。文章每被浏览一次,则其阅读量 +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 --


1 条评论 / 1 人参与
吉超

不错