【补充】多个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())
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17571607.html