CRM手记-6 | Django

# 排序功能开发;
# 单条件排序;
# 在表头每个字段上都添加a标签,点击降序,记住这次操作,再次点击反序(用箭头图标展示);
    # table_obj_list.html
        <th><a href="?_o=">{{ column }}</a></th>
        # _0等于字段的索引,如果为负,反序;
        # 所以可以通过模板标签forloop.count0来取;
        <th><a href="?_o={{forloop.count0}}">{{ column }}</a></th>
    # 考虑排序与过滤的关系;
    #     即可以过滤后排序,又可以排序后过滤;
    # 先忽略过滤条件,做筛选;
        # views.py
            def get_filter_result(request,querysets):
                filter_conditions = {}
                for key,val in request.GET.items():
                    # 排除分页的影响
                    if key in (‘page‘,‘_o‘):continue
                    if val:
                        filter_conditions[key] = val

                    print("filter_conditions",filter_conditions)
                return querysets.filter(**filter_conditions),filter_conditions

    # 在筛选条件下做筛选搜索;考虑分页,排序,筛选的前后顺序;
    # 先排序再分页!分页后再排序的话,排序不受分页参数影响;==>>全局排序;
        # views.py
            def get_orderby_result(request,querysets,admin_class):
                """排序"""
                field_index = request.GET.get(‘_o‘,‘‘)
                if field_index:
                    # 从list_display中拿到字段名
                    field_name = admin_class.list_filter[int(field_index)]
                    # 获取字段名,根据字段名做正方排序
                    return querysets.order_by(field_name)
                else:
                    return querysets

            @login_required
            def table_obj_list(request,app_name,model_name):
                ...
                # 排序
                querysets = get_orderby_result(request,querysets,admin_class)
# 只有单方向排序;
# 怎么记住上次排序?再次点击做反方向排序;考虑-0的情况;
    # views.py
        @login_required
        def table_obj_list(request,app_name,model_name):
            ...
            # 排序后端数据查询
            querysets,current_order_field = get_orderby_result(request,querysets,admin_class)
            ...

            return render(request,‘kingadmin/table_obj_list.html‘, {
                ‘querysets‘:querysets,
                ‘admin_class‘:admin_class,
                ‘current_page‘:current_page,
                ‘current_order_field‘:current_order_field
            })

        def get_orderby_result(request,querysets,admin_class):
            """排序"""
            # 1.从url中获取排序下表参数
            field_index = request.GET.get(‘_o‘,‘‘)
            current_order_field = {}
            # 2.判断是否已经排序
            if field_index:
                print("当前下标:%s"%field_index)
                # 2.1 如果有排序,根据下标绝对值从list_display中拿到字段名;
                field_name = admin_class.list_display[abs(int(field_index))]
                print(‘当前排序字典:%s‘%field_name)
                # kingadmin_tags.order_handle 中需要的数据:用于前端获知当前字段上次排序参数正负情况;
                current_order_field[field_name] = field_index
                print(‘当前访问后的字典:%s‘%current_order_field)
                # 4.如果排序的参数为负数,做反序查询
                if field_index.startswith(‘-‘):
                    field_name = ‘-‘+field_name
                # 5.返回排序后的查询对象
                return querysets.order_by(field_name),current_order_field
            # 2.2 如果没有排序,返回原始查询集
            else:
                return querysets,current_order_field

    # table_obj_list.html
        <thead>
            <tr>
            {% if admin_class.list_display %}
                {% for column in admin_class.list_display %}
                    <th><a href="?_o={% get_order_factor column current_order_field forloop.counter0 %}">
                        {{ column }}</a>
                    </th>
                {% endfor %}
                {% else %}
                <th>{% get_model_name admin_class %}</th>
            {% endif %}
            </tr>
        </thead>
    # kingadmin_tag.py
        @register.simple_tag
        def get_order_factor(column,current_order_field,forloop):
            """前端访问参数设置,访问后参数取反"""
            # 1.判断当前列是否排序
            #   前端怎么知道当前列是否已经排序?需要记住上次访问传入的参数;
            #   后端在处理一次排序之后,将此次排序参数依据存在一个字典中,然后传到前端做判断;
            if column in current_order_field:
                # print(‘current_order_field:%s column:%s‘%(current_order_field,column))
                last_sort_index = current_order_field[column]
                print(‘已经点击的链接中下标:%s‘%last_sort_index)
                if last_sort_index.startswith(‘-‘):
                    current_sort_index = last_sort_index.strip(‘-‘)
                else:
                    current_sort_index = ‘-%s‘%last_sort_index
                print(‘生成下次点击的下标:%s‘%current_sort_index)
                return current_sort_index
            else:
                return forloop

# 增加排序标志
    # table_obj_list.html
        <span class="glyphicon glyphicon-triangle-{% arror_direction current_order_field column %}" aria-hidden="true"></span>
    # kingadmin_tag.py
        # 箭头方向展示
        @register.simple_tag
        def arror_direction(current_order_field,column):
            arror_direction = ‘‘
            # 先判断是否已经排序
            if column in current_order_field:
                print(‘column:%s‘%column)
                if current_order_field[column].startswith(‘-‘):
                    arror_direction = ‘top‘
                else:
                    arror_direction = ‘bottom‘
            return arror_direction
    # 附:注意要有bootstrap的fonts文件才可以显示箭头;

原文地址:https://www.cnblogs.com/pymkl/p/8319309.html

时间: 2024-10-13 00:35:19

CRM手记-6 | Django的相关文章

CRM手记-2 | Django

#################################### kingadmin ###################################### # 需要做到的效果:点击客户库,出现所有客户信息,以及增删改查|多条件过滤|搜索|排序等功能: # 后台添加相应数量的客户: # 给admin中客户信息显示样式做自定制,包括过滤等: # admin.py class CustomerAdmin(admin.ModelAdmin): list_display = ['name'

CRM手记-8 | Django

# 搜索|在已经过滤的条件之下做搜索; # 在查询语句中,用"包含"来做模糊搜索: # model_class.objects.filter(contact__contains='33') # 涉及到Q的操作;这里通过Q这个类来实现; # table_obj_list.html <form> <input type="search" name="_q"> <input type="submit"

CRM手记- 12 | Django

# 4.删除 # 在修改记录页面左下角添加一个删除按钮,一个链接,跳转至一个提示删除内容的页面,确认删除: # 关联删除,删除记录同时也删除外键的关联表; # table_obj_common.html <div class="form-group"> <div class="col-sm-10"> <a href="{% table_obj_delete app_name model_name form_obj.instan

CRM手记-5 | Django

# 过滤补充; # 点击userprofile表报错; # 因为当没有自定义admin_class时,默认使用的是BaseKingAdmin: # 所以,BaseKingAdmin需要做一些默认的配置; # admin_base.py class BaseKingAdmin(object): list_display = [] list_filter = [] search_fields = [] # 此时列表为空,build_table_row()的将没有返回值,前端显示空; # 做一个判断:

django--项目创建

一.django 框架初探 (心蓝1202) 1 web框架介绍 wsgi web service gate interface web框架就是讲web应用开发中通用的部门抽象出来,形成一个框架,再去实现我们特定的功能 django 全能型 tornado 优秀的异步框架 web.py 小区的web框架 flask 优秀的轻量级的web框架 设计模式:mtv m models moxing t template 模板 v view 视图 2.django框架的介绍 1.环境搭建,django的安

Django之路 - 项目实战之&lt;教育行业CRM开发&gt;

本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每月算工资时,就按这个表来统计招生提成, 后来学校大了点,教室变成了3间,招生老师变成了4个人,招的学生也开始多了起来,不过大家依然是招了学生就纪录在自己的excel里,但问题开始出现了,我们的招生多是通过网络qq聊天在线咨询,好多客户需要聊很久才能转化成学员,经常会出现一个客户跟一个招生老师聊过后,

Django CRM学员系统项目

项目需求: 1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个班级至少包含一个或多个讲师4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员5.客户要有咨询纪录, 后续的定期跟踪纪录也要保存6.每个学员的所有上课出勤情况\学习成绩都要保存7.学校可以有分校区,默认每个校区的员工只能查看和管理自己校区的学员8.客户咨询要区分来源 开发一个项目 首选就是先设计好表结构 表结构设计完成 后面写代码就比较轻松了 我这边创建的项目是crm 项目名为app

Django CRM客户关系管理系统

CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现在企业与客户之间的业务和企业内部之前部门之间的业务.因此CRM客户关系管理系统不但可以记录企业自内部信息,对于客户信息存储也是可以做到的,其中还涉及市场竞争对手的情报资料,还包括了企业进行营销.销售及支持服务所需的各种数据. 功能实现 (1)建议统一的信息编码系统; (2)设计能够良好反映事物特性的

Django项目:CRM(客户关系管理系统)--40--32PerfectCRM实现King_admin添加不进行限制

1 # forms.py 2 # --------19PerfectCRM实现King_admin数据修改-------- 3 from django import forms 4 from crm import models 5 6 # class CustomerModelForm(forms.ModelForm): 7 # class Meta: #调用内置方法 8 # model = models.Customer #获取表名 9 # fields = "__all__" #字