BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)

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())

BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)_第1张图片

BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)_第2张图片

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 %}

BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)_第3张图片

3. 无限级 分类实现

# 利用新字段 pid >> parent_id 父id
	给下一级的标题增加pid 就可以形成无限级分类
    
    
# 此外 红黑树数据结构 也可以实现

BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)_第4张图片

BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)_第5张图片

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 %}

{{ article.title }}

{{ article.desc }}
posted @ {{ article.create_time|date:'Y-m-d H:i' }} {{ article.up_num }} {{ article.down_num }} {{ article.comment_num }}
{% 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())

BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)_第6张图片

你可能感兴趣的:(BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能))