实现Django Admin的多对多的复选框效果

效果:左边显示的是未选中的字段,右边显示的是已选中的字段,两边点击的标签可以互相更换

首先在king_admin.py中增加filter_horizontal字段

 class CustomerAdmin(BaseAdmin):
list_display = ['qq','name','source','consultant','consult_course','date','status']
list_filters = ['source','consultant','consult_course','status','date']
search_fields = ['qq','name','consultant__name']
list_per_page = 5
ordering = 'id'
filter_horizontal = ['tags',]

在views中不需要进行修改

在页面增加复选框的样式和相应的标签

 <div class="col-sm-5" style="width:340px">
{% if field.name in admin_class.filter_horizontal %}
{# 实现和Django类似的复选框#}
<div class="col-md-4">
{% get_m2m_tags admin_class field form_obj as m2m_obj_tags%}
<select multiple class="filter-select-box-left" id="id_{{ field.name }}_from">
{% for obj_tag in m2m_obj_tags%}
<option ondblclick="move_element(this,'id_{{ field.name }}_to','id_{{ field.name }}_from')" value="{{ obj_tag.id }}">{{ obj_tag }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-4">
{% get_m2m_selected_tags form_obj field as select_tags%}
<select tag="choose_list" multiple name="{{ field.name }}"class="filter-select-box-right" id="id_{{ field.name }}_to">
{% for obj_tag in select_tags %}
<option ondblclick="move_element(this,'id_{{ field.name }}_from','id_{{ field.name }}_to')" value="{{ obj_tag.id }}">{{ obj_tag }}</option>
{% endfor %}
</select>
</div>
{% else %}
{{ field }}
{% endif %}
</div>

在页面的css中修改复选框的样式

 {% block css %}
<style type="text/css">
.filter-select-box-left{
height:160px!important;
width:120px;
margin-right:10px;
border-re
}
.filter-select-box-right{
height:160px!important;
width:120px;
margin-left:60px;
}
</style> {% endblock %}

在页面的js中增加点击事件,点击复选框内的元素可以实现互相转移

思路:将左边复选框中的option节点删除,右边复选框的option节点增加

 function move_element(ths,target_id,new_target_id){
//移动思路:删除左边当前标签,在右边添加当前标签
var opt_ele = "<option value='" + $(ths).val() + "' ondblclick=move_element(this,'"+new_target_id+"','"+target_id+"')>" + $(ths).text()+"</option>" //$(ele).off().ondblclick();
//$(ele).appendTo("#"+target_id);
$('#'+target_id).append(opt_ele);
$(ths).remove();
}

同时在提交的时候,将右边的复选框的所有元素全选,然后提交

首先给form表单添加onsubmit事件

     //循环右边所有的元素,然后全选
function select_all_choose(){
$('select[tag="choose_list"] option').each(function(){
$(this).prop("selected",true);
})
return true;
}

在tag自定义标签中,实现后台渲染返回到前端

右边的复选框:返回记录中已选的tags

思路:通过getattr从当前的form_obj.instance和列名中获取到已选的tags对象

 @register.simple_tag
def get_m2m_selected_tags (form_obj,field):
#返回已选中的复选框数据
if form_obj.instance.id:
field_obj = getattr(form_obj.instance,field.name)
return field_obj.all()

左边的复选框:返回记录没有选择的tags

思路:获取数据库全部的tags和已选的tags,然后循环,如果不是已选的tags则放入到一个新的列表,返回

 @register.simple_tag
def get_m2m_tags(admin_class,field,form_obj):
#返回多对多所有待选数据 #表结构对象的多对多字段
all_field_obj = getattr(admin_class.model,field.name)
#全部多对多字段
all_field_list = all_field_obj.rel.to.objects.all() if form_obj.instance.id:#判断记录是否有多对多对象,如果没有则是新建,有就是修改
# 已选数据的多对多对象
choose_field_obj = getattr(form_obj.instance, field.name)
#已选数据的多对多字段
selected_obj_list = choose_field_obj.all()
else: #表示创建新的记录
return all_field_list standby_obj_list = []
for obj in all_field_list:
if obj not in selected_obj_list:
standby_obj_list.append(obj) return standby_obj_list

Python CRM项目四的更多相关文章

  1. Python CRM项目二

    一.准备工作 如果没有配置基本的项目,请参考 http://www.cnblogs.com/luhuajun/p/7771196.html 当我们配置完成后首先准备我们的app 创建2个app分别对应 ...

  2. Python CRM项目八

    自定义用户认证 目的:实现Django自定义的认证系统,在生产环境都是根据此代码进行定制的 步骤: 1.在settings文件中配置要使用的类 #命名规则 app名称.类名 AUTH_USER_MOD ...

  3. Python小项目四:实现简单的web服务器

    https://blog.csdn.net/u010103202/article/details/74002538 本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www ...

  4. Python CRM项目一

    开发环境: 语言Python3.X以上 MTV WEB框架 Django 前端框架 jQuery+bootstrap 数据库 MySQL 运行环境 安装Python3.x 安装Django 除IE8以 ...

  5. Python CRM项目三

    1.分页: 分页使用Django内置的分页模块来实现 官方的分页案例 from django.core.paginator import Paginator, EmptyPage, PageNotAn ...

  6. python实践项目四:猜数字游戏

    题目要求:在1-20中随机生成一个数字,你来猜,只有6次机会. 举例一: #!/usr/bin/python # -*- coding: UTF-8 -*- import random secretN ...

  7. Python CRM项目七

    仿照Django Admin实现对readonly的字段进行设置 功能点: 1.页面不可进行更改 2.如果改变html代码中的值,则需要进行后端的数据库数据校验 3.可以对某些字段进行自定制校验规则 ...

  8. Python CRM项目六

    自定义Django Admin的action 在Django Admin中,可以通过action来自定义一些操作,其中默认的action的功能是选中多条数据来进行删除操作 我们在king_admin中 ...

  9. CRM项目之RBAC权限组件-day26

    写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...

随机推荐

  1. 获取tranform参数函数的封装

    平时我们都会去获取元素的各种属性值,例如宽高等等的值!但是tranform是个让人很头疼的点,获取出来的是矩阵,耐何线性代数学的并不是那么6啊. 解决方法的思路:只能采取有点取巧的方法,在我们设置的时 ...

  2. Java与算法之(9) - 直接插入排序

    直接插入排序是最简单的排序算法,也比较符合人的思维习惯.想像一下玩扑克牌抓牌的过程.第一张抓到5,放在手里:第二张抓到3,习惯性的会把它放在5的前面:第三张抓到7,放在5的后面:第四张抓到4,那么我们 ...

  3. Java内存管理及对Java对象管理

    Java内存管理及对Java对象管理 1Java内存管理 1.1Java中的堆和栈 通常来说,人们会将Java内存氛围栈内存(Stack)和堆内存(Heap). 栈内存用来保存基本类型的变量和对象的引 ...

  4. 连连看(dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

  5. 关于JAVA实现二维码以及添加二维码LOGO

    今天在公司,完成了之前的任务,没有什么事做,就想鼓捣一下二维码,因为之前没有接触过,我就去翻看了几本书,也基本完成了二维码的实现,以及添加二维码的LOGO. 现在绘制二维码一般都使用的是谷歌的zxin ...

  6. Spring框架学习笔记(1)——HelloWorld

    1.创建一个新的项目,并添加Spring框架 2.创建HelloWorld.java package com.broadtext.beans.helloworld; public class Hell ...

  7. SSM框架原理,作用及使用方法

    ---恢复内容开始--- 尊重原创:http://m.blog.csdn.net/dennis_wu_/article/details/73437097 作用: SSM框架是spring MVC ,s ...

  8. js取整并保留两位小数的方法

    js 四舍五入函数 toFixed(),里面的参数 就是保留小数的位数.注意 toFixed()方法只针对数字类型,如果是字符类型需要使用Number()等方法先转换数字类型再使用 document. ...

  9. [数据分析工具] Pandas 功能介绍(一)

    如果你在使用 Pandas(Python Data Analysis Library) 的话,下面介绍的对你一定会有帮助的. 首先我们先介绍一些简单的概念 DataFrame:行列数据,类似 Exce ...

  10. 部署Asp.net Core 项目发生502.5 或者500 没有其他提示信息

    最近将公司原来.NetCore 1.6的项目升级到.net Core 2.0首先发生 502.5的错误,包括IIS日志,Windows应用程序日志都没有记录问题始终解决不了,首先看看官网给出的解决方案 ...