django7天人气排行方法(待优化)
总体思路:专门创建一个根据日期保存浏览量的表,根据每浏览一次保存当天的浏览数据,点击首页时候,数据库查询七天数据,保存数据保存字典,如果字典键相同,把键相同值相加,然后排序,排序后变成三维列表,再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>
本文作者: 永生
本文链接: https://yys.zone/detail/?id=142
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
评论列表 (0 条评论)