首页 > 其他分享 >【补充】多个URL公用一个是视图函数

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

时间:2023-07-21 15:56:13浏览次数:33  
标签:category filter URL list 公用 blog 视图 article param

【补充】多个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())

标签:category,filter,URL,list,公用,blog,视图,article,param
From: https://www.cnblogs.com/dream-ze/p/17571607.html

相关文章

  • 从输入URL到页面加载完成的过程中都发生了什么
      首先,对于http肯定是有客户端和服务器的,在这个语境中,客户端和服务器本质上也都是一个软件,实现了http协议相关标准的软件。客户端一般由都是由浏览器充当,也就是说,在浏览器中实现了http客户端的相关功能。而服务器的实现就多种多样啦,我们可以用java写servlet,c#写ASP.net,还有php,r......
  • vue生成二维码以及获取当前的地址url
    <template> <divclass="hello">  <h2>二维码</h2>  <canvasref="qrCodeCanvas"></canvas><div>{{url}}</div> </div></template><script>importQRCodefrom'qrco......
  • python urldecode()
    PythonURL解码(urldecode())简介在网络编程中,经常会遇到需要对URL进行编码和解码的情况。URL编码是将URL中的特殊字符转换为特定格式的过程,而URL解码则是将编码后的URL还原为原始URL的过程。Python提供了一个内置函数urllib.parse.unquote()来执行URL解码操作,该函数可以解码包含特......
  • 根据url下载文件java后端
    根据URL下载文件的Java后端在开发Web应用程序时,经常需要从URL下载文件。Java后端使用URL连接和输入流可以轻松地实现文件下载功能。本文将介绍如何使用Java后端根据URL下载文件,并提供相应的代码示例。1.使用URL连接获取文件输入流使用Java的java.net包提供的URL类可以方便地与U......
  • 正则表达式解析StarRocks雾化视图中的血缘关系
    解析SQL中的底表主要目标是获取出StarRocks雾化中的底表和字段备注,之后给字段赋予备注值,存入库表,可以动态生成数据字典,web可以利用该表实现mybatis的动态sql拼接,动态化的excel导出导入,魔板等功能。尝试使用了Jsqlparser解析sql语句,发现遇到部分复杂的子查询内包含unionall情况......
  • Java根据原始URL获取网络重定向后的URL
    方法1:/***获取重定向地址*@parampath原地址*@return*@throwsException*/privateStringgetRedirectUrl(Stringpath)throwsException{HttpURLConnectionconn=(HttpURLConnection)newURL(path)......
  • CURL常用参数
    CURLcurl-XPOST-i'http://10.25.5.36/service/api/v1/province/registerSourceQuery'-H"Content-Type:application/json"-d'{"messageHeader":{"accessAccount":"43198521900","sign":"43198......
  • python爬取之url管理器
    classUrlManager():#url管理器def__init__():#设置新老url数组,分别为未爬取和已爬取self.new_urls=set()self.old_urls=set()defadd_new_url(self,url):#添加单个urlifurlisNoneorlen(url)==0:return......
  • Oracle数据字典(各种视图、表)
    数据字典是存放整个数据库实例重要信息的一组表,这些数据字典大部分都是SYS用户所有。数据字典的构成Oracle数据字典名称由前缀和后缀组成,使用下画线“_”连接。其代表的含义如下。USER_:记录用户的对象信息。ALL_:记录用户的对象信息及被授权访问的对象信息。DBA_:包含数据......
  • 数据库(SQL注入问题、视图、触发器、事务、存储过程、内置函数、流程控制、索引)
    SQL注入问题SQL注入的原因:由于特殊符号的组合会产生特殊的效果 实际生活中,尤其是在注册用户名的时候会非常明显的提示你很多特殊符号不能用,会产生特殊的效果。结论:涉及到敏感数据部分,不要自己拼接,交给现成的方法拼接即可。importpymysql#链接MySQL服务端conn=pymysql.......