Django学习:博客阅读计数统计(16)
Blog
模型添加数字字段,每次有人打开博客详情页,就将记录数+1
- 修改
blog models.py
文件增加计数字段
----snip----
class Blog(models.Model):
readed_num = models.Integer(default=0)
----snip----
- 修改
blog admin.py
增加新增字段的显示
from django.contrib import admin
from .models import Blog,BlogType
# Register your models here.
@admin.register(Blog)
class BlogAdmin(admin.ModelAdmin):
list_display = ('pk', 'title', 'author', 'readed_num', 'blog_type', 'is_deleted', 'created_time', 'last_updated_time')
ordering = ('pk', )
@admin.register(BlogType)
class BlogTypeAdmin(admin.ModelAdmin):
list_display = ('pk', 'type_name', )
- 修改处理方法
views.py
,当用户进入到博客详情页面时,计数就加1
----snip----
def blog_detail(request, blog_pk):
blog = get_object_or_404(Blog, pk=blog_pk)
blog.readed_num += 1
blog.save()
----snip----
- 执行迁移操作
python manage.py makemigrations
python manage.py migrate
-
启动服务,随意点击一片文章
-
进入后台管理页面查看,可以看到这个页面的计数增加了。
但是可以看到这个最后一次修改时间也被修改掉了(需要后续优化)。
- 给前端模板
blog_detail.html
添加字段,用于显示阅读计数
<ul class='blog_info_description'>
<li>作者:{{ blog.author }}</li>
<li>分类:<a href='{% url "blogs_with_type" blog.blog_type.pk %}'>{{ blog.blog_type }}</a></li>
<li>发表时间:{{ blog.created_time|date:"Y-m-d G:m:s" }}</li>
<li>阅读({{ blog.readed_num }})</li>
</ul>
- 修改
blog_list.html
让博客列表也同样显示阅读计数
----snip----
<div class="panel-body">
{% for blog in blogs %}
<div class="blog">
<h3><a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a></h3>
<p class="blog_info">
<span class="glyphicon glyphicon-tag"></span><a href='{% url "blogs_with_type" blog.blog_type.pk %}'>{{ blog.blog_type }}</a>
<span class="glyphicon glyphicon-time"></span>{{ blog.created_time|date:"Y-m-d" }}
阅读({{ blog.readed_num }})
</p>
<p>{{ blog.content|striptags|truncatechars_html:120 }}</p>
</div>
{% empty %}
<div class="blog">
<h3>-- 暂无博客,敬请期待 --</h3>
</div>
{% endfor %}
</div>
----snip----
- 刷新博客列表页面
设置计数规则:1、无视是否同一个人,每次打开博客都记录;2、若同一个人,每隔多久才算一次阅读。根据自己要求设置。
下面通过cookie来进行设置,同一用户详情页刷新不增加计数,退出浏览器后再次访问增加计数。
- 修改
views.py
文件
----snip----
def blog_detail(request,blog_pk):
blog = get_object_or_404(Blog, pk=blog_pk)
if not request.COOKIES.get('blog_%s_readed' % blog_pk):
blog.readed_num += 1
blog.save()
context = {}
context['previous_blog'] = Blog.objects.filter(created_time__gt=blog.created_time).last()
context['next_blog'] = Blog.objects.filter(created_time__lt=blog.created_time).first()
context['blog'] = blog
response = render_to_response('blog/blog_detail.html', context)
response.set_cookie('blog_%s_readed' % blog_pk, 'true')
return response
现在详情页面多次刷新不会出现增加阅读数量的情况了,另外,如果退出浏览器,再次打开进入博客页面,数量会增加1.
目前存在2个问题:
- 在后台编辑博客的过程中,可能有新的访问,比如这时候计数为3,编辑博客过程中计数增加2变为5,但是保存的时候依旧还是3。另外还有一个问题,每次访问计数增加,都会改变最后修改时间字段。
- 只能统计同个博客的阅读总量,无法统计每一天的博客阅读量。