Advertisement

Diango博客--12.开发 Django 博客文章阅读量统计功能

阅读量:

文章目录

    • 0.models中增加新字段
    • 1.models中增加方法
    • 2.迁移数据库
    • 3.修改视图函数
    • 4.在模板中显示阅读量

0.models中增加新字段

为了记录文章的浏览量,需要在文章的数据库表中新增一个用于存储阅读量的字段。

文件位置:blog/models.py

复制代码
    class Post(models.Model):
    # ... 其它已有字段
    # 新增 views 字段记录阅读量
    views = models.PositiveIntegerField(default=0, editable=False)

注意:

1)views 字段的类型为 PositiveIntegerField,该类型的值只允许为正整数或 0,因为阅读量不可能为负值。

2)初始化时 views 的值为 0。

3)将 editable 参数设为 False 将不允许通过 django admin 后台编辑此字段的内容。因为阅读量应该根据被访问次数统计,而不应该人为修改。

1.models中增加方法

当用户访问了某篇文章,这时就应该将 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'])

注意:

1)increase_views 方法首先将自身对应的 views 字段的值 +1(此时数据库中的值还没变);

2)然后调用 save 方法将更改后的值保存到数据库。

3)注意这里使用了 update_fields 参数来告诉 Django 只更新数据库中 views 字段的值,以提高效率。

2.迁移数据库

一旦更改了模型,就需要迁移数据库,以便让 Django 将更改反应到数据库中。在项目根目录运行如下两条命令:

pipenv run python manage.py makemigrations pipenv run python manage.py migrate

3.修改视图函数

当用户请求访问某篇文章时,处理该请求的视图函数为 detail 。

一旦该视图函数被调用,说明文章被访问了一次,因此我们修改 detail 视图函数,让被访问的文章在视图函数被调用时阅读量 +1

即只需在视图函数中调用模型的 increase_views 方法即可。

文件位置: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
        TocExtension(slugify=slugify),
    ])
    post.body = md.convert(post.body)
    
    m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)
    post.toc = m.group(1) if m is not None else ''
    
    return render(request, 'blog/detail.html', context={'post': post})

4.在模板中显示阅读量

在模板中显示阅读量和显示其它字段一样,只需要使用模板变量即可。即模板适当的地方使用 {{ 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,从而达到粗略统计阅读量的目的。

全部评论 (0)

还没有任何评论哟~