zoukankan      html  css  js  c++  java
  • python+Django CRM客户关系管理系统开发(十)--左右移动选择框功能开发

    一、本节目标

    前几节我们开发了数据展示,数据增删改查,只读字段处理等,本节我们开发可以左右移动选择的多选框

    二、功能分析

    1、对于多选框,admin的实现方式是,在自定义admin里,添加filter_horizontal,然后在admin里可以看见,有一个可以左右选择的多选框,可以左右移动选项来进行选择。

     

     添加功能也是如此:

    查看后台,可以发现,其实是放到了select选择框里:

    三、功能开发

    1、在baseadmin里添加对应字段:

     2、在自定义admin里添加要左右选择的字段

     3、接下来开发:

     目前是这么展示的:

     要变成这样展示:

    需要把这个字段的数据全部取出来,然后放到select框里。由于这里是多对多:

    取出数据的方法如下实验:

    from crm import models

    field_obj = models.CustomerInfo._meta.get_field('consult_courses')
    print(field_obj)
    obj_list = field_obj.related_model.objects.all()
    print(obj_list)

    输出:

     先取出此字段对应的对象,是一个表中的字段,然后根据这个对象查找出关联表的数据。

    这里因为有下划线,因此还是放到tag里:

    4、前端页面修改,先修改修改页面table_obj_change,主要是做了一个判断,如果是左右移动选择框里的内容,就显示在自定义的select框里:

    效果如图:

    5、在右边添加一个select框,存放已选中的项,已选中的项的数据,还是上边那种获取方法:

     修改前端页面,这里修改修改页面table_obj_change:

     效果:

    已经可获取,但是还需完善,左边不显示已经被选择过的

    6、完善左边多选框里,已经被选中的项目,让其不再显示

    因此,这里需要修改一下获取所有选择项这里:

    这里用到集合的求差集的方法,以前觉得没有用的功能,这里就派上了用场,所有的基本知识点都有用,都需要牢记:

    selected_data = {'python'}
    all_data = {'python','go'}
    print(all_data)
    print(all_data - selected_data)

    输出:

    修改tag

     

    此时效果如图:

    7、开发点击左右选择的功能,可以通过双击咨询课程,来选择:

    <form class="form-horizontal" method="post" onsubmit="VerificationBeforeFormSubmit()">
    {% csrf_token %}
    {{ form_obj.errors }}
    {% for field in form_obj %}
    <div class="form-group">
    <label for="inputEmail3" class="col-sm-2 control-label">{{field.label}}</label>
    <div class="col-sm-10">
    <!--可供选择的-->
    {% if field.name in admin_class.filter_horizontal %}
    <div class="col-lg-5">
    <select id="id_{{ field.name }}_from" multiple class="form-control">
    {% get_available_m2m_data field.name admin_class form_obj as available_m2m_data %}
    {% for obj in available_m2m_data %}
    <option ondblclick="MoveSelectedOption(this,'id_{{ field.name }}_to')" value="{{ obj.id }}">{{ obj }}</option>
    {% endfor %}
    </select>
    </div>
    <!--已选中的-->
    <div class="col-lg-5">
    <select tag="selected_m2m" id="id_{{ field.name }}_to" multiple class="form-control" name="{{field.name}}">
    {% get_selected_m2m_data field.name form_obj admin_class as selected_m2m_data %}
    {% for obj in selected_m2m_data %}
    <option value="{{ obj.id }}" ondblclick="MoveSelectedOption(this,'id_{{ field.name }}_from')">{{ obj }}</option>
    {% endfor %}
    </select>
    </div>

    <div class="col-lg-5"></div>
    {% else %}
    {{ field }}
    {% endif %}
    <span style="color: red">{{ field.errors.0 }}</span>
    </div>
    </div>
    {% endfor %}

    {% for field in admin_class.readonly_fields %}
    <div class="form-group">
    <label for="inputEmail3" class="col-sm-2 control-label">{{field}}</label>
    <div class="col-sm-10">
    {% comment %} {{ field }}{% endcomment %}
    <p>{% get_obj_field_value form_obj field %}</p>
    </div>
    </div>
    {% endfor %}

    <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
    <button type="submit" class="btn btn-info">save</button>
    </div>
    </div>

    </form>
    </body>

    <script>

    function MoveSelectedOption(ele,target_id) {

    var new_target_id = $(ele).parent().attr('id');
    var option = "<option value='" + $(ele).val() +"'ondblclick=MoveSelectedOption(this,'"+ new_target_id +"') >" + $(ele).text() +"</option>";
    $("#"+ target_id).append(option);
    $(ele).remove();

    }


    function VerificationBeforeFormSubmit() {


    $("select[tag] option").prop('selected',true);

    }
    </script>
  • 相关阅读:
    Pentest_Mind-mapping 渗透测试思维导图
    pt-archiver归档数据丢失
    Vue笔记:bin-code-editor使用
    Vue笔记:Vue3 Table导出为Excel
    Go异步check简单示例
    flask_apscheduler定时任务组件使用
    组织沟通文化的变革与卓有成效的管理沟通
    业绩核能
    管理
    SAP MM 移动平均价管理的物料库存初始化导入的一个小问题
  • 原文地址:https://www.cnblogs.com/realizetomoney/p/13909792.html
Copyright © 2011-2022 走看看