zoukankan      html  css  js  c++  java
  • CRM排序——第19天

    1、排序是在过滤了之后进行排序的,在view.py视图里加上

      #排序过后的数据
      object_list,order_key = table_order(request,object_list)
    def display_table_objs(request,app_name,table_name):
    
        print("-->",app_name,table_name)
        #models_module = importlib.import_module('%s.models'%(app_name))
        #model_obj = getattr(models_module,table_name)
        admin_class = kind_admin.enabled_admins[app_name][table_name]
        #admin_class = king_admin.enabled_admins[crm][userprofile]
    
        #object_list = admin_class.model.objects.all()
        object_list,filter_condtions = table_filter(request,admin_class)
    
        #排序过后的数据
        object_list,order_key = table_order(request,object_list)
    
        paginator = Paginator(object_list, admin_class.list_per_page) # Show 25 contacts per page
        print("paginator------",paginator)
        page = request.GET.get('page')
        try:
            query_sets = paginator.page(page)
        except PageNotAnInteger:
            # If page is not an integer, deliver first page.
            query_sets = paginator.page(1) ##这个是对你的分页的数据进行取值
        except EmptyPage:
            # If page is out of range (e.g. 9999), deliver last page of results.
            query_sets = paginator.page(paginator.num_pages)
        print("query_sets------------",query_sets)
        return render(request,"kindadmin/table_objs.html",{"admin_class":admin_class,
                                                            "query_sets":query_sets,
                                                            "filter_condtions":filter_condtions,
                                                           "order_key":order_key})

    上面的table_order函数是在utils.py文件中:

    先判断请求时是否有o这个字段,如果有就先给他排序,为了处理开始点击时是升序排序,再次去点击是降序排序(反转排序),会判断o这个字段请求过来的值(orderby_key)是否是以'-'开头,

    如果是把"-"去掉,如果不是把"-"加上,最后返回排序后的值或者还是原来的值和o字段的值

    order_by(a) #a=正的是升序,负的是降序
    
    order_key.startswith("-") #判断是否一"-"开始的
    
    order_key.strip("-")  #去除“-”这个符号
    def table_order(request,objs):
        """判断请求过来是否有o字段,有就排序"""
        orderby_key = request.GET.get("o")
        if orderby_key:
            objs=objs.order_by(orderby_key)
    
            if orderby_key.startswith("-"):
                orderby_key=orderby_key.strip("-")
            else:
                orderby_key = ("-%s")%orderby_key
        return objs,orderby_key

    2、当o请求的时候,会把o也当成是一个筛选条件,导致排序不成功,处理方法是在请求有o这个字段时就不保存,代码如下在utils.py文件中:

    def table_filter(request,admin_class):
        """进行条件过滤并返回过滤后的数据"""
    
        filter_conditions = {}
        for k,v in request.GET.items():
            if k == 'page' or k == 'o':
                continue
            if v:
                filter_conditions[k]=v
        print("filter_conditions:",filter_conditions)
        print("admin_class.model.objects.filter(**filter_conditions)",admin_class.model.objects.filter(**filter_conditions))
        return admin_class.model.objects.filter(**filter_conditions),filter_conditions

    3、在自定义标签tag.py文件中定义个函数返回页面值

      3.1点击排序会有一个图标向上或者向下,可以在bootstrap里面直接复制过来如: 

    icon = '''<span class="glyphicon glyphicon-triangle-top" aria-hidden="true"></span>'''
    icon = '''<span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>'''

    可能这两个图标加载不出来,下载bootstrap的源码,把里面的内容拷到statics/fonts文件下

           3.2  在tag.py文件里面定义一个函数判断返回前端页面的显示

      3.2.1 判断请求的参数o(order_key)是否有值,如有再判断是否是以“-“开头的,则

        icon = '''<span class="glyphicon glyphicon-triangle-top" aria-hidden="true"></span>'''

        如果不是一"-"开头的则:

                icon = '''<span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>'''

    在次判断如果请求过来的o()order_key)等于字段值就显示icon图标,如果不等于就不显示icon图标

    如果请求过来的order_key是None,那么也是不显示icon图标

    因为当在页面筛选时也能排序,所以在<a>标签的href里面拼接参数

    代码如下:

    @register.simple_tag
    def build_reverse_order(column,order_key,filter_condtions):
        """页面排序展示交换反转"""
        sel_ele = ""
        for k, v in filter_condtions.items():
            sel_ele+= "&%s=%s" %(k, v)
        ele = '''<th><a href="?{sel_ele}&o={order_key}">{column}</a>
                    {icon}
                </th>
        '''
        if order_key:
    
            if order_key.startswith("-"):
                icon = '''<span class="glyphicon glyphicon-triangle-top" aria-hidden="true"></span>'''
            else:
                icon = '''<span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>'''
    
            if order_key.strip("-") == column or order_key == column:
                order_key=order_key
    
            else:
                order_key=column
                icon = ""
        else:
            order_key = column
            icon=""
        ele = ele.format(order_key=order_key, column=column,icon=icon,sel_ele=sel_ele)
    
        return mark_safe(ele)

    在返回到客户信息表重新点击进去的时候会报错,order_key是None,没有strip()这个属性,然后我在build_reverse_order函数加了一个order_key是否有值的判断,比视频早发现并改了有一点点的开心吧。嗯逻辑处理和思路还是得加强

        

  • 相关阅读:
    JS 异步编程
    JS XMLHttpRequest
    JS 日期
    JS DOM
    JS 异常处理
    JS BOM
    JS 正则表达式
    JS 面向对象
    (22)python PhantomJS
    HDU1698 线段树(区间更新区间查询)
  • 原文地址:https://www.cnblogs.com/venvive/p/11329253.html
Copyright © 2011-2022 走看看