zoukankan      html  css  js  c++  java
  • 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个问题:

    1. 在后台编辑博客的过程中,可能有新的访问,比如这时候计数为3,编辑博客过程中计数增加2变为5,但是保存的时候依旧还是3。另外还有一个问题,每次访问计数增加,都会改变最后修改时间字段。
    2. 只能统计同个博客的阅读总量,无法统计每一天的博客阅读量。
  • 相关阅读:
    20151224--
    20151223--联系人项目
    20151222--Ajax三级无刷新
    20151221--三级有刷新联动
    20151220--导航前四问已解答
    递归
    Request和Response详解
    无刷新三级联动查询
    20151219--导航自己制作的一部分
    151030
  • 原文地址:https://www.cnblogs.com/sjfeng1987/p/11436092.html
Copyright © 2011-2022 走看看