添加新字段
为了记录文章的访问量,需要在文章的数据库表中新增一个用于存储阅读量的字段。
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,从而达到粗略统计阅读量的目的
原文地址:https://www.cnblogs.com/daidechong/p/10025743.html