总体思路:专门创建一个根据日期保存浏览量的表,根据每浏览一次保存当天的浏览数据,点击首页时候,数据库查询七天数据,保存数据保存字典,如果字典键相同,把键相同值相加,然后排序,排序后变成三维列表,再html遍历

C:\Users\yys53\OneDrive\python\blog\home\views.py

def recent_seven_days():  # 通过for 循环得到天数,如果想得到两周的时间,只需要把8改成15就可以了。
    """获取从今天起前七天日期"""
    d = datetime.datetime.now()  # 2019-6-28 9:25:43.843164
    lists = []
    for i in range(0, 7):  # i:1-7
        oneday = datetime.timedelta(days=i)  # 1 day, 0:00:00  2 days, 0:00:00 ... 7 days, 0:00:00
        day = d - oneday  # 2019-06-27 11:32:10.186535 2019-06-26 11:32:10.186535 ... 2019-06-21 11:32:10.186535
        date_to = datetime.datetime(day.year, day.month,
                                    day.day)  # 2019-06-27 00:00:00 2019-06-26 00:00:00 ... 2019-06-21 00:00:00
        lists.append(str(date_to)[0:10])  # 2019-06-27 2019-06-26 ... 2019-06-21
    return lists

class IndexView(View):
    ......
        # 当前天 显示当前日期是本周第几天
        dic = {}
        for day in recent_seven_days():
            newly = CountDateView.objects.filter(date=day).order_by('-day_views')
            for i in newly:
               
                key = (i.article_id, i.article.title)
                if key in dic:
                    dic[key] += i.day_views
                    continue
                dic[key] = i.day_views
                # lis.append((view.article_id, view.day_views))
        article_infos = sorted(dic.items(), key=lambda dic: dic[1], reverse=True)
        # [((数据1, 数据2), 数据3), )] 格式变成3维列表
        article_lis = []
        for i in article_infos:
            article_lis.append((i[0][0], i[0][1], i[1]))
        article_lis = article_lis[:9]

class DetailView(View):
        # 让浏览量+1(如果没有访问cookie就+1,如果读到就不进)
        if not request.COOKIES.get("blog_%s_readed" % id):
            # article.total_views += 1
            # article.save()
            # 为什么不用save,用save后Article的updated时间会更新,所以用update,防止更新,下一句是进入文章后total_views更新不加不会即使更新
            Article.objects.filter(id=id).update(id=id, total_views=article.total_views + 1)
            article = Article.objects.get(id=id)
            
            # 让七天浏览量开始统计
            date = datetime.datetime.now().date()
            count_date_view, true_or_false = CountDateView.objects.get_or_create(article_id=id, date=date)
            count_date_view.day_views += 1
            count_date_view.save()

 

C:\Users\yys53\OneDrive\python\blog\home\models.py

class CountDateView(models.Model):
    """记录每天文章访问量"""
    article = models.ForeignKey(Article, on_delete=models.CASCADE, null=True)
    # 浏览量
    day_views = models.PositiveIntegerField(default=0)
    # 文章的创建时间
    date = models.DateField(auto_now_add=True)
    class Meta:
        db_table = 'CountDateView'
        verbose_name = '统计每天访问量'
        verbose_name_plural = verbose_name

C:\Users\yys53\OneDrive\python\blog\templates\include\mycard.html

<!-- 7天人气排行 -->
                        <div class="mt-3 bg-white pt-2 pl-3  card " style="margin-top: 1px;border:1px solid; padding:2em; overflow: hidden">
                        <h4><strong>7天人气排行</strong></h4>
                                    <hr>
                                    {% for id, title, totle_view in  article_lis %}
                                        <a href="{% url 'home:detail' %}?id={{ id }}" style="color: black">{{ forloop.counter }}.{{ title }}[{{ totle_view }}]</a><br>
                                    {% endfor %}

                        </div>