【补充】多个URL公用一个是视图函数

【补充】多个URL公用一个是视图函数

  • 我们可以根据路由地址后面参数的不同跳转到指定的功能函数里面
  • 我们也可以在函数内根据关键位置传参,跳转到指定路由
# 侧边栏筛选页面搭建 ---- 指向同一个路由
# # (1) 分类筛选  http://127.0.0.1:8000/dream/category/1
# # re_path(r'^(?P<username>\w+)/category/(\d+)/', views.site),
# path('<str:username>/category/<int:category_id>/', views.site),
# # (2) 标签筛选 http://127.0.0.1:8000/dream/tag/1
# path('<str:username>/tag/<int:category_id>/', views.site),
# # (3) 日期筛选 http://127.0.0.1:8000/dream/archive/2023-06
# path('<str:username>/archive/<str:date>/', views.site),
  • 但是使用上面的方法的话,代码会冗余很多,

    • 在多个路由使用同一个视图函数时
    • 我们需要考虑到优化问题
  • 优化后的代码

# 侧边栏筛选页面搭建 ---- 指向同一个路由(合并路由)
re_path(r"^(?P<username>\w+)/(?P<condition>category|tag|archive)/(?P<param>.*)/", views.site),
  • 后端根据前端的路由做出指定的功能划分
def site(request, username, **kwargs):
    '''

    :param request:
    :param username:
    :param kwargs: 如果该参数有值,则代表我们需要对 article_list 做额外的筛选操作
    :return:
    '''
    # 校验当前用户名对应的个人站点是否存在
    user_obj = models.UserInfo.objects.filter(username=username).first()
    # 用户如果不存在,返回 404 页面
    if not user_obj:
        return render(request, 'error.html', locals())

    # 用户存在,展示个人站点
    blog = user_obj.blog
    article_list = models.Article.objects.filter(blog=blog)

    if kwargs:
        # print(kwargs) # {'condition': 'tag', 'param': '1'}
        condition = kwargs.get('condition')

        param = kwargs.get('param')

        # 判断筛选条件
        if condition == "category":
            article_list = article_list.filter(category_id=param)
        elif condition == "tag":
            # 跨表查询
            article_list = article_list.filter(tags__id=param)
        elif condition == "archive":
            year, month = param.split('-')  # 2023-06  > [2023,06]
            article_list = article_list.filter(create_time__year=year, create_time__month=month)
        else:
            return render(request, 'error.html')

    # 查询当前用户所有的分类及分类下的文章数
    category_list = models.Category.objects.filter(blog=blog).annotate(category_num=Count('article__pk')).values('name',
                                                                                                                 'category_num',
                                                                                                                 'pk')
    # 查询当前用户所有的标签及标签下的文章数
    tag_list = models.CategoryTag.objects.filter(blog=blog).annotate(category_num=Count('article__pk')).values('name',
                                                                                                               'category_num',
                                                                                                               'pk')
    # 按照年月统计所有的文章 - 年月归档
    date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth("create_time")).values(
        "month").annotate(count_num=Count('pk')).values('month', 'count_num')

    return render(request, 'site.html', locals())
posted @ 2023-07-21 15:48  Chimengmeng  阅读(9)  评论(0编辑  收藏  举报