码迷,mamicode.com
首页 > 其他好文 > 详细

Django 统计文章阅读量(或热度排名)

时间:2018-11-27 13:41:04      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:for   存储   博客   ref   efault   object   EDA   模型   return   

添加新字段

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

 

1 /models.py
2 
3 class Post(models.Model):
4     #其它已有字段
5     #新添views字段记录阅读量
6     views = models.PositiveInterField(default=0)

 

注意 views 字段的类型为 PositiveInterField,该类型的值只允许为正整数或0,因为阅读量不可能

为负数。初始化时views的值为0。

添加模型方法

一旦用户访问了某篇文章,只是就应该将views的值 +1,这个过程最好有post模型

自己来完成,因此再给模型添加一个自定义的方法:

 

 1 /models.py
 2 
 3 class Post(models.Model):
 4     # ... 其它已有字段
 5     # 新增 views 字段记录阅读量
 6     views = models.PositiveIntegerField(default=0)
 7     
 8     # ... 其它已有的模型方法  
 9     def increase_views(self):
10         self.views += 1
11         self.save(update_fields=[views])

 

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

然后调用 save 方法将更改后的值保存到数据库。注意这里使用了 update_fields 参数

来告诉 Django 只更新数据库中 views 字段的值,以提高效率。

你也许担心如果两个人同时访问一篇文章,更改数据库中的阅读量字段的值时会不会冲突?

其实不必担心,我们本来就不是精确地统计阅读量,而且个人博客的流量通常也不会很大,

所以偶尔的冲突导致的数据误差是可以忽略不计的。

修改视图函数

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

说明文章被访问了一次,因此我们修改 detail 视图函数,让被访问的文章在视图函数被

调用时阅读量 +1。

 1 blog/views.py
 2 
 3 def detail(request, pk):
 4     post = get_object_or_404(Post, pk=pk)
 5     
 6     # 阅读量 +1
 7     post.increase_views()
 8     
 9     post.body = markdown.markdown(post.body,
10                                   extensions=[
11                                       markdown.extensions.extra,
12                                       markdown.extensions.codehilite,
13                                       markdown.extensions.toc,
14                                   ])
15     form = CommentForm()
16     comment_list = post.comment_set.all()
17     context = {post: post,
18                form: form,
19                comment_list: comment_list
20                }
21     return render(request, blog/detail.html, context=context)

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

设置热门文章排名如下

 

 1 def articlecont(request):
 2     #文档内容
 3     #获取显示的文章id
 4     nid = request.GET.get(nid)
 5     #获取文章
 6     articledata = models.article.objects.filter(id=nid).first()
 7     #获取到的文章调用incease_views方法
 8     models.article.increase_views(articledata)
 9     #根据自增的views字段进行排序,并获取最高的5条数据
10     hotdoc = models.article.objects.order_by("-views")[0:5]
11     return render(request, "articlecont.html", {"articledata": articledata,hotdoc:hotdoc})

 

模板中的操作

在模板中显示阅读量和显示其它字段一样,只需要使用模板变量即可。即模板适当的地方使用 {{ post.views }} 模板变量。这里我们分别修改两个地方,分别是 index.html 和 detail.html。

 

1 templates/blog/detail.html
2 
3 <div class="entry-meta">
4   ...
5   <span class="views-count"><a href="#">{{ post.views }} 阅读</a></span>
6 </div>

 

好了,这样当用户每访问一次文章详情,views 记录的数值就会 +1,从而达到粗略统计阅读量的目的

 

Django 统计文章阅读量(或热度排名)

标签:for   存储   博客   ref   efault   object   EDA   模型   return   

原文地址:https://www.cnblogs.com/daidechong/p/10025743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!