BBS项目分布搭建三(个人站点时间归档补充,)
1. 个人站点时间归档
"""
settings.py设置最好更改以下:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False # 数据库时间
"""
# 在 blog.html文件中修改:
时间归档
{% for date in date_list %}
{% endfor %}
# 在views.py中修改个人站点功能:
# 7.个人站点页
def blog(request, username):
'''
验证站点是否存在
:param request:
:param username:
:return:
'''
# 验证站点的存在性 404页面
user_obj = models.UserInfo.objects.filter(username=username).first()
if not user_obj:
# 应该返回定制的404页面
return render(request, '404.html')
blog = user_obj.blog # 个人站点
# 查询当前站点的所有文章列表
article_list = models.Article.objects.filter(blog=blog).all()
'''查询当前站点下的所有标签'''
# 第一步:
tag_list = models.Tag.objects.filter(blog=blog).all()
# print(tag_list)
# 第二步:聚合查询每一个标签下的文章数量
'''
聚合查询使用关键字annotate
分组查询使用关键字aggreate
'''
from django.db.models import Count
# tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list('title', 'count_num')
# tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article')).values_list('title', 'count_num')
tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article')).values('title', 'count_num')
# print(tag_list)
'''查询当前站点下的所有分类'''
category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values('title', 'count_num')
# print(category_list)
'''把当前站点下的文章按照年月分组,并且查询分组下的文章数量'''
from django.db.models.functions import TruncMonth
# 1. 查的是添加文章的时间:年月
# 2. 查询分组之后的文章数量
# 3. month => 2021-06 => 虚拟字段
date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('id')).values('month', 'c')
print(date_list)
return render(request, 'blog.html', locals())
2. 实现侧边栏筛选跳转功能
# 添加路由:
# 侧边栏筛选功能
# url(r'^(?P\w+)/tag/(?P \d+)', views.blog), # 标签
# url(r'^(?P\w+)/category/(?P \d+)', views.blog), # 分类
# url(r'^(?P\w+)/archive/(?P \w+)', views.blog), # 分类
# 以上三个地址可以合并为一个地址
url(r'^(?P\w+)/(?Ptag|category|archive)/(?P .*)', views.blog),
# 修改个人站点功能:
# 7.个人站点页
def blog(request, username, **kwargs):
print(123)
'''
验证站点是否存在
:param request:
:param username:
:return:
'''
# 验证站点的存在性 404页面
user_obj = models.UserInfo.objects.filter(username=username).first()
if not user_obj:
# 应该返回定制的404页面
return render(request, '404.html')
blog = user_obj.blog # 个人站点
# 查询当前站点的所有文章列表
article_list = models.Article.objects.filter(blog=blog).all()
# 侧边栏少选功能
if kwargs:
# print(kwargs) # {'conditon': 'tag', 'param': '2'}
# print(kwargs) # {'conditon': 'category', 'param': '1'}
# print(kwargs) # {'conditon': 'archive', 'param': '2022-03'}
conditon = kwargs.get('conditon')
param = kwargs.get('param')
if conditon == 'tag':
# 按照标签筛选
article_list = article_list.filter(tags__pk=param)
elif conditon == 'category':
# 按照分类进行筛选
article_list = article_list.filter(category__id=param)
else:
# 按照时间筛选
# 2022-03
year, month = param.split('-') # [2022, 03]
article_list = article_list.filter(create_time__year=year, create_time__month=month)
'''查询当前站点下的所有标签'''
# 第一步:
tag_list = models.Tag.objects.filter(blog=blog).all()
# print(tag_list)
# 第二步:聚合查询每一个标签下的文章数量
'''
聚合查询使用关键字annotate
分组查询使用关键字aggreate
'''
from django.db.models import Count
# tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list('title', 'count_num')
# tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article')).values_list('title', 'count_num')
tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article')).values('title', 'count_num', 'pk')
# print(tag_list)
'''查询当前站点下的所有分类'''
category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values('title', 'count_num', 'pk')
# print(category_list)
'''把当前站点下的文章按照年月分组,并且查询分组下的文章数量'''
from django.db.models.functions import TruncMonth
# 1. 查的是添加文章的时间:年月
# 2. 查询分组之后的文章数量
# 3. month => 2021-06 => 虚拟字段
date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('id')).values('month', 'c')
# print(date_list)
return render(request, 'blog.html', locals())
# 修改 blog.html文件 :
我的标签
{% for tag in tag_list %}
{% endfor %}
我的分类
{% for category in category_list %}
{% endfor %}
时间归档
{% for date in date_list %}
{% endfor %}
3. 无限级 分类实现
# 利用新字段 pid >> parent_id 父id
给下一级的标题增加pid 就可以形成无限级分类
# 此外 红黑树数据结构 也可以实现
4. 文章详情页
# 新建公共HTML文件用于模板继承 base.html:
Title
我的标签
{% for tag in tag_list %}
{% endfor %}
我的分类
{% for category in category_list %}
{% endfor %}
时间归档
{% for date in date_list %}
{% endfor %}
{% block content %}
{% endblock %}
# blog.html就可以直接继承 base.html:
{% extends 'base.html' %}
{#// 模板继承#}
{#下面为动态内容#}
{% block content %}
{% for article in article_list %}
{% endfor %}
{% endblock %}
# 创建文章详情页 article_detail.html:
{% extends 'base.html' %}
{% block content %}
{{ article_detail.title }}
{{ article_detail.content|safe }}
{% endblock %}
# 添加路由 路由放在侧边筛选路由上方 避免正则匹配不到:
# 文章详情页
url(r'^(?P\w+)/(?P\d+)', views.article_detail),
# 添加文章详情页功能 views.py中:
from django.db.models import Count
# 8. 文章详情页
def article_detail(request, username, article_id):
user_obj = models.UserInfo.objects.filter(username=username).first()
if not user_obj:
return render(request, '404.html')
blog = user_obj.blog # 个人站点
# 查询文章详情数据
article_detail = models.Article.objects.filter(pk=article_id, blog=blog).first()
if not article_detail:
return render(request, '404.html')
tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article')).values('title', 'count_num', 'pk')
'''查询当前站点下的所有分类'''
category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values('title', 'count_num', 'pk')
'''把当前站点下的文章按照年月分组,并且查询分组下的文章数量'''
from django.db.models.functions import TruncMonth
# 1. 查的是添加文章的时间:年月
# 2. 查询分组之后的文章数量
# 3. month => 2021-06 => 虚拟字段
date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('id')).values('month', 'c')
return render(request, 'article_detail.html', locals())