Python CRM项目四
实现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项目四的更多相关文章
- Python CRM项目二
一.准备工作 如果没有配置基本的项目,请参考 http://www.cnblogs.com/luhuajun/p/7771196.html 当我们配置完成后首先准备我们的app 创建2个app分别对应 ...
- Python CRM项目八
自定义用户认证 目的:实现Django自定义的认证系统,在生产环境都是根据此代码进行定制的 步骤: 1.在settings文件中配置要使用的类 #命名规则 app名称.类名 AUTH_USER_MOD ...
- Python小项目四:实现简单的web服务器
https://blog.csdn.net/u010103202/article/details/74002538 本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www ...
- Python CRM项目一
开发环境: 语言Python3.X以上 MTV WEB框架 Django 前端框架 jQuery+bootstrap 数据库 MySQL 运行环境 安装Python3.x 安装Django 除IE8以 ...
- Python CRM项目三
1.分页: 分页使用Django内置的分页模块来实现 官方的分页案例 from django.core.paginator import Paginator, EmptyPage, PageNotAn ...
- python实践项目四:猜数字游戏
题目要求:在1-20中随机生成一个数字,你来猜,只有6次机会. 举例一: #!/usr/bin/python # -*- coding: UTF-8 -*- import random secretN ...
- Python CRM项目七
仿照Django Admin实现对readonly的字段进行设置 功能点: 1.页面不可进行更改 2.如果改变html代码中的值,则需要进行后端的数据库数据校验 3.可以对某些字段进行自定制校验规则 ...
- Python CRM项目六
自定义Django Admin的action 在Django Admin中,可以通过action来自定义一些操作,其中默认的action的功能是选中多条数据来进行删除操作 我们在king_admin中 ...
- CRM项目之RBAC权限组件-day26
写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...
随机推荐
- Java下使用Apache POI生成具有三级联动下拉列表的Excel文档
使用Apache POI生成具有三级联动下拉列表的Excel文档: 具体效果图与代码如下文. 先上效果图: 开始贴代码,代码中部分测试数据不影响功能. 第一部分(核心业务处理): 此部分包含几个方面: ...
- ssm maven spring AOP读写分离
ssm maven spring AOP读写分离 总体流程 配置最开始写在pom.xml文件,解析到数据库配置文件,再解析到spring配置文件. 自定义注解DataSource:通过这个注解并且在s ...
- 浴室沉思:聊聊DAL和Repository
这是一个由DDD群引发的随笔 在写了上一篇随笔<关于ORM的浴室沉思>后一些朋友私聊我,很多刚接触DDD的朋友会对Repository(仓储层)这东西有点疑惑,为什么要叫仓储层?是不是三层 ...
- Open Judge 2750 鸡兔同笼
2750:鸡兔同笼 ...
- bzoj:1723: [Usaco2009 Feb]The Leprechaun 寻宝
Description 你难以想象贝茜看到一只妖精在牧场出现时是多么的惊讶.她不是傻瓜,立即猛扑过去,用她那灵活的牛蹄抓住了那只妖精. “你可以许一个愿望,傻大个儿!”妖精说. “财富 ...
- CodeForces628-B.New Skateboard
B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用
摘要 近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法.本文先对现有基于深度学习的目标跟踪算法进行了分类梳理,后续会分篇对各个算法进行详细描述. 看上方给出的3张图片,它们 ...
- UE4 内容示例网络同步Learn
一, 1.1 Actor的复制 Actor中的Replicates ,为true时,服务器会把该Actor同步,显示在客户端中. 1.2 Switch Has Authority判断是客户端还是服务器 ...
- JavaScript基础:DOM操作详解
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 JavaScript的组成 JavaScript基础分为三个部分: ...
- 给外行或者刚入门普及一下关于C#,.NET Framework(.NET框架),.Net,CLR,ASP,ASP.Net, VS,以及.NET Core的概念
一.概念 1. C# :C#是微软公司发布的一种面向对象的.运行于.NET Framework之上的高级程序设计语言. 2..NET Framework(.NET框架):.NET framework ...