Django项目:CRM(客户关系管理系统)--35--27PerfectCRM实现King_admin编辑复选框
- #admin.py
- # ————————01PerfectCRM基本配置ADMIN————————
- from django.contrib import admin
- # Register your models here.
- from crm import models #从crm导入models
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- from django.shortcuts import render
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # ————————04PerfectCRM实现King_admin注册功能————————
- class CustomerAdmin(admin.ModelAdmin):#定制Djanago admin
- list_display = ('id','qq','source','consultant','content','date')#显示字段表头
- # ————————11PerfectCRM实现King_admin分页显示条数————————
- list_per_page = 2 #分页条数
- # ————————11PerfectCRM实现King_admin分页显示条数————————
- # ————————16PerfectCRM实现King_admin日期过滤————————
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
- # list_filter = ('source','consultant','consult_courses',)
- list_filter = ('date','source','consultant','consult_courses',)
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- # ————————16PerfectCRM实现King_admin日期过滤————————
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- #搜索(不能包含CharField)(注意加 逗号 , )
- search_fields = ('name','qq',)
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- # ————————26PerfectCRM实现King_admin自定义排序————————
- ordering = ['-qq'] #自定义排序,默认'-id'
- # ————————26PerfectCRM实现King_admin自定义排序————————
- # ————————27PerfectCRM实现King_admin编辑复选框————————
- filter_horizontal = ('tags',) #复选框
- # ————————27PerfectCRM实现King_admin编辑复选框————————
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # from django.shortcuts import render
- actions = ['test_actions',]#定制功能 #测试返回到一个新页面
- def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容
- return render(request,"king_admin/table_index.html")
- test_actions.short_description = "测试显示中文"
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # ————————04PerfectCRM实现King_admin注册功能————————
- #注册到 Django Admin里
- admin.site.register(models.Branch) #01校区表
- admin.site.register(models.ClassList) #02班级表
- admin.site.register(models.Course) #03课程表,可以报名那些课程
- # ————————04PerfectCRM实现King_admin注册功能————————
- # admin.site.register(models.Customer) #04客户信息表
- admin.site.register(models.Customer,CustomerAdmin) #04客户信息表
- # ————————04PerfectCRM实现King_admin注册功能————————
- admin.site.register(models.CustomerFollowUp) #05客户跟进表
- admin.site.register(models.Enrollment) #06学员报名信息表
- admin.site.register(models.Payment) #07缴费记录表
- admin.site.register(models.CourseRecord) #08每节课上课纪录表
- admin.site.register(models.StudyRecord) #09学习纪录
- admin.site.register(models.UserProfile) #10账号表
- admin.site.register(models.Role) #11角色表
- admin.site.register(models.Tag) #12标签表
- '''
- Django Admin里账号密码重置方法
- #运行 Terminal
- python manage.py createsuperuser
- Username : admin
- Email address: admin@qq.com
- Password: admin123456
- Password (again): admin123456
- 英文转中文方法
- 到settings.py里修改
- # LANGUAGE_CODE = 'en-us'
- LANGUAGE_CODE = 'zh-Hans'
- '''
- # ————————01PerfectCRM基本配置ADMIN————————
#admin.py
- # kingadmin.py
- # ————————04PerfectCRM实现King_admin注册功能————————
- from crm import models
- #print("kingadmin crm",models.Customer)
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- # from king_admin.base_admin import register,BaseAdmin
- from king_admin.base_admin import site,BaseAdmin
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- from django.shortcuts import render
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- #04客户信息表
- class CustomerAdmin(BaseAdmin):#定制Djanago admin
- list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date') # 显示字段表头
- # ————————11PerfectCRM实现King_admin分页显示条数————————
- list_per_page = 2 #分页条数 # 默认分页条数10
- # ————————11PerfectCRM实现King_admin分页显示条数————————
- # ————————16PerfectCRM实现King_admin日期过滤————————
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
- # list_filter = ('source','consultant','consult_courses',)
- list_filter = ('date','source','consultant','consult_courses',)
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- # ————————16PerfectCRM实现King_admin日期过滤————————
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- #搜索(不能包含CharField)(注意加 逗号 , )
- search_fields = ('name','qq',)
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- # ————————26PerfectCRM实现King_admin自定义排序————————
- ordering = '-qq' #自定义排序,默认'-id'
- # ————————26PerfectCRM实现King_admin自定义排序————————
- # ————————27PerfectCRM实现King_admin编辑复选框————————
- filter_horizontal = ('tags',) #复选框
- # ————————27PerfectCRM实现King_admin编辑复选框————————
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # from django.shortcuts import render
- actions = ['test_actions',]#定制功能 #测试返回到一个新页面
- def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容
- return render(request,"king_admin/table_index.html")
- test_actions.short_description = "测试显示中文"
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- # register(models.Customer,CustomerAdmin)
- # register(models.CourseRecord)
- site.register(models.Customer,CustomerAdmin)
- site.register(models.CourseRecord)
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- # ————————04PerfectCRM实现King_admin注册功能————————
# kingadmin.py
- #base_admin.py
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- from django.shortcuts import render,redirect
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # ————————04PerfectCRM实现King_admin注册功能————————
- #Django admin 注册功能的形式
- # sites = {
- # 'crm':{
- # 'customers':CustomerAdmin,
- # 'customerfollowup':CustomerFollowUPAdmin,
- # }
- # }
- class AdminRegisterException(Exception): #自定义异常
- def __init__(self,msg):
- self.message = msg
- class BaseAdmin(object):#自定义方法
- list_display = () #显示的字段(不能包含ManyToManyField)
- # ————————11PerfectCRM实现King_admin分页显示条数————————
- list_per_page = 10 # 默认分页条数10
- # ————————11PerfectCRM实现King_admin分页显示条数————————
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- list_filter = () # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- search_fields = () #搜索(不能包含CharField)(注意加 逗号 , )
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- # ————————26PerfectCRM实现King_admin自定义排序————————
- ordering = None #自定义排序
- # ————————26PerfectCRM实现King_admin自定义排序————————
- # ————————27PerfectCRM实现King_admin编辑复选框————————
- filter_horizontal = []#复选框
- # ————————27PerfectCRM实现King_admin编辑复选框————————
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- actions = []#自定功能
- default_actions = ["delete_selected",] #默认删除的函数
- #默认删除的函数
- def delete_selected(self,request,queryset):
- # from django.shortcuts import render, redirect
- print("goint to delete ",queryset)
- app_name=self.model._meta.app_label#app名
- model_name=self.model._meta.model_name#表名
- objs=queryset#类对象
- action=request._admin_action
- print(action,'<-------action')
- if request.POST.get('delete_confirm')=='yes': #{#table_delete.html#}
- queryset.delete()
- return redirect('/king_admin/%s/%s/'%(app_name,model_name))
- selected_ids=','.join([str(i.id) for i in queryset])
- print(selected_ids,'<---selected_ids')
- objs=queryset
- return render(request,"king_admin/table_delete.html", locals()) #返回删除页
- delete_selected.short_description = "默认批量删除"
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- class AdminSite(object):
- def __init__(self):
- self.registered_sites = {} #传到views 里调用
- def register(self,model,admin_class=None): #默认值None 使用 BaseAdmin
- app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
- model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
- if app_name not in self.registered_sites:
- self.registered_sites[app_name] = {} #创建 crm={}
- if model_name in self.registered_sites[app_name]:
- raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
- %(app_name,model_name))#自定义异常,
- if not admin_class:
- admin_class = BaseAdmin #默认值None 使用 BaseAdmin
- # self.registered_sites[app_name][model_name] = admin_class #注册APP
- # site = AdminSite() # 实例化类 单例模式
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- #registered_sites {'crm': {'customer': <class 'crm.kingadmin.CustomerAdmin'>, 'courserecord': <class 'kingadmin.base_admin.BaseAdmin'>}}
- #把类名放到class的对象里,然后通过class的对象传到前端
- # admin_class.model = model
- # self.registered_sites[app_name][model_name] = admin_class #注册APP
- #
- # site = AdminSite() #实例化类 单例模式
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
- #没有实例化会使用同一个内存地址
- admin_obj = admin_class() #先实例化
- admin_obj.model = model #参数赋值给实例
- self.registered_sites[app_name][model_name] = admin_obj#注册APP
- #实例化后,调用会使用不同的内存地址
- site = AdminSite() #实例化类 单例模式
- # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
- # registered_sites={}
- # def register(model,admin_class=None): #默认值None 使用 BaseAdmin
- # app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
- # model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
- # if app_name not in registered_sites:
- # registered_sites[app_name] = {} #创建 crm={}
- # if model_name in registered_sites[app_name]:
- # raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
- # %(app_name,model_name))#自定义异常
- # if not admin_class:
- # admin_class = BaseAdmin #默认值None 使用class BaseAdmin
- # registered_sites[app_name][model_name] = admin_class #注册APP
- # ————————05PerfectCRM实现King_admin注册功能获取内存————————
- # ————————04PerfectCRM实现King_admin注册功能————————
#base_admin.py
- {#table_change.html#}
- {## ————————19PerfectCRM实现King_admin数据修改————————#}
- {#{% extends "king_master/king_index.html" %}#}
- {##}
- {#{% load kingadmin_tags %}#}
- {#{% block right-container-content %}#}
- {##}
- {# {{ obj_form }}#}
- {##}
- {#{% endblock %}#}
- {## ————————19PerfectCRM实现King_admin数据修改————————#}
- {## ————————20PerfectCRM实现King_admin数据修改美化————————#}
- {% extends 'king_master/king_index.html' %} {#继承模板#}
- {% load kingadmin_tags %} {#通过自己定义标签获取中文,Django中利用filter与simple_tag为前端自定义函数的实现方法#}
- {% block right-container-content %}
- <div class="row" style="margin-bottom: 20px" >
- <ol class="breadcrumb">
- <li><a href="/king_admin/">主页</a></li>
- <li><a href="/king_admin/{% get_app_name admin_obj.model %}/">{% get_app_name admin_obj.model %}</a></li>
- <li><a href="/king_admin/{% get_app_name admin_obj.model %}/{% get_model_name admin_obj.model %}/">
- {% get_model_verbose_name admin_obj.model %} </a></li>
- {% if not admin_obj.is_add_form %} {# 新建时 ForeignKey不能实例化 #}
- <li class="active">{{ obj_form.instance }}</li> {# 修改时 实例化 #}
- {% endif %}
- </ol>
- {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
- {# <h4>修改:{% get_model_verbose_name admin_obj.model %}</h4>#}
- {% block Tops %}
- <div class="panel panel-info">
- <h4 style='color: red'>修改: {% get_model_verbose_name admin_obj.model %}</h4>
- </div>
- {% endblock %}
- {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
- </div>
- <div class="row">
- {{ obj_form.errors }}
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- {#<form class="form-horizontal" method="post" >{% csrf_token %}#}
- <form class="form-horizontal" method="post" onsubmit="return BeforeFormSubmit(this);">{% csrf_token %}
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- {% for field in obj_form %}
- <div class="form-group">
- <label class="col-sm-2 " style="font-weight: normal"> {#字体#}
- {% if field.field.required %} {#required判断是不是必须填写#}
- <b>{{ field.label }}</b>
- {% else %}
- {{ field.label }}
- {% endif %}
- </label>
- <div class="col-sm-10" >
- <span style="color: red;">{{ field.errors }}</span>
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- {# {{ field }}#}
- {% if field.name in admin_obj.filter_horizontal %} <!-- 水平--><!-- 判断是否复选框-->
- {% get_m2m_chosen_objs admin_obj field.name obj_form.instance as m2m_chosen_objs %} <!--当前对象已经选中的字段名-->
- <!-- 左边待选框-->
- <div class="col-md-6">
- <!-- 取所有的内容-->
- {% get_m2m_available_objs admin_obj field.name as m2m_available_objs %}
- {# <input type="text" oninput="FuzzSearch(this,'id_{{ field.name }}_from')" class="form-control">#}
- <!-- 字段名-->
- <select multiple field_name="{{ field.name }}" class="form-control filter-select-box" id="id_{{ field.name }}_from" >
- <!-- 字段名 是否为不能修改-->
- {% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
- {% for obj in m2m_available_objs %}
- {% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
- <option value="{{ obj.id }}" disabled>{{ obj }}</option>
- {% endif %}
- {% endfor %}
- {% else %}
- {% for obj in m2m_available_objs %}
- {% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
- <option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_to')">{{ obj }}</option>
- {% endif %}
- {% endfor %}
- {% endif %}
- </select>
- </div>
- <!-- 中间箭头-->
- <div class="col-md-1">
- <div><h4 style='color: #00ff06'>待选 -> </h4></div>
- <div><h4 style='color: #8dffc5'>双击选择 </h4></div>
- <div><h4 style='color: #ff0003'> <- 已选 </h4></div>
- </div>
- <!-- 右边已选框-->
- <div class="col-md-5">
- <select m2m_right="yes" name="{{ field.name }}" multiple field_name="{{ field.name }}" class="form-control" id="id_{{ field.name }}_to">
- {% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
- {% for obj in m2m_chosen_objs %}
- <option value="{{ obj.id }}" disabled>{{ obj }}</option>
- {% endfor %}
- {% else %}
- {% for obj in m2m_chosen_objs %}
- <option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_from')">{{ obj }}</option>
- {% endfor %}
- {% endif %}
- </select>
- </div>
- {% else %}
- {{ field }} <span style="color: #bce8f1"> {{ field.help_text }}</span>
- {# <span style="color:red">{{ field.errors }}</span>#}
- {% endif %} <!-- 判断是否复选框-->
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- </div>
- </div>
- {% endfor %}
- {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
- {## ————————23PerfectCRM实现King_admin数据删除————————#}
- {# <a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>#}
- {## ————————23PerfectCRM实现King_admin数据删除————————#}
- {# <input type="submit" value="保存" class="pull-right btn btn-info" > {#放右边#}
- <div class="form-group">
- {% block del %}
- <div class="col-sm-2">
- <a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>
- </div>
- {% endblock %}
- <div class="col-sm-10">
- <input type="submit" value="保存" class="pull-right btn btn-info">
- </div>
- </div>
- {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
- </form>
- </div>
- {% endblock %}
- {## ————————20PerfectCRM实现King_admin数据修改美化————————#}
{#table_change.html#}
- {#king_base.html#}
- {## ————————02PerfectCRM创建ADMIN页面————————#}
- {#模板文件 king_base.html#}
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- {# <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。#}
- {# <meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。#}
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <meta name="description" content="">
- <meta name="author" content="">
- <link rel="icon" href="/static/king_img/king_logo.jpg">{# icon,指的是图标 #}
- <title>KingAdmin</title> {# 页面头部显示#}
- {# 使用link来调用外部的css文件#}
- <link rel="stylesheet" href="/static/king_css/bootstrap.css" /> {#导航栏样式#}
- <link rel="stylesheet" href="/static/king_css/dashboard.css" /> {#指示板样式#}
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- <link rel="stylesheet" href="/static/king_css/king_admin_change.css" /> {#编辑复选框样式#}
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- </head>
- <body>
- {% block body %}{#自定义内容 body#}{% endblock %}
- {# 将纯JavaScript的语句另外保存在一个"*.js"的文件中,需要时再调用。#}
- <script src="/static/king_js/jquery.js"></script> {# jQuery 是一个 JavaScript库,极大地简化了 JavaScript 编程。#}
- <script src="/static/king_js/bootstrap.js"></script> {#指示板JS事件#}
- {## ————————24PerfectCRM实现King_admin自定义操作数据————————#}
- <script src="/static/king_js/king_admin_js.js"></script> {#自定义JS事件#}
- {## ————————24PerfectCRM实现King_admin自定义操作数据————————#}
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- <script src="/static/king_js/king_admin_change.js"></script> {#编辑复选框JS事件#}
- {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
- </body>
- </html>
- {## ————————02PerfectCRM创建ADMIN页面————————#}
{#king_base.html#}
- /*king_admin_change.css*/
- /*# ————————27PerfectCRM实现King_admin编辑复选框————————*/
- .filter-select-box{
- height: 230px;!important;
- width:100%;
- }
- /*# ————————27PerfectCRM实现King_admin编辑复选框————————*/
/*king_admin_change.css*/
- // king_admin_change.js
- // # ————————27PerfectCRM实现King_admin编辑复选框————————
- function BeforeFormSubmit(form_ele) {
- console.log(form_ele);
- //$('form input[disabled]').prop("disabled", false);//修改为可提交
- $("form").find("[disabled]").removeAttr("disabled");//修改为 可提交
- $('select[m2m_right="yes"] option').prop('selected', true);
- return true;
- }
- function MoveEleTo(from_ele, target_ele_id) {
- //move options from from_ele to target ele
- var field_name = $(from_ele).parent().attr("field_name");//获option名
- if (target_ele_id.endsWith('_from')) {//判断是否
- var new_target_id = "id_" + field_name + "_to";
- } else {
- var new_target_id = "id_" + field_name + "_from";
- }
- //创建一个新标签
- var opt_ele = "<option value='" + $(from_ele).val() + "' ondblclick=MoveEleTo(this,'" + new_target_id + "') >" + $(from_ele).text() + "</option>";
- $("#" + target_ele_id).append(opt_ele);//添加到另一边选框
- $(from_ele).remove();//移除选中的
- }
- // # ————————27PerfectCRM实现King_admin编辑复选框————————
// king_admin_change.js
- #kingadmin_tags.py
- # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
- # # 因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
- # from django import template #模板
- # register = template.Library() #模板库
- #
- # @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
- # def get_app_name(model_obj):
- #
- # # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
- # # return model_obj._meta.verbose_name_plural
- # '''
- # #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
- # class Meta:
- # verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
- # verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
- # '''
- # model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
- # if not model_name:
- # model_name = model_obj._meta.model_name
- #
- # return model_name
- # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
- # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
- # ————————07PerfectCRM实现King_admin显示注册的表————————
- #因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
- from django import template #模板
- register = template.Library() #模板库
- @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
- def get_model_verbose_name(model_obj):
- '''
- #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
- class Meta:
- verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
- verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
- '''
- model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
- if not model_name:
- model_name = model_obj._meta.model_name
- return model_name
- @register.simple_tag
- def get_model_name(model_obj):
- return model_obj._meta.model_name
- @register.simple_tag
- def get_app_name(model_obj):
- return model_obj._meta.app_label
- # ————————07PerfectCRM实现King_admin显示注册的表————————
- # ————————09PerfectCRM实现King_admin显示注册表的内容————————
- from django.utils.safestring import mark_safe #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
- @register.simple_tag
- def build_table_row(admin_obj,obj):#通过kingadmin_tags在后台处理 再传到前端
- row_ele = "" #为了生成一整行返回前端
- if admin_obj.list_display:#如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin)
- # ————————19PerfectCRM实现King_admin数据修改————————
- #循环所有 要显示 的字符串 进行反射 展示 字段
- # for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = ()
- for index, column in enumerate(admin_obj.list_display): # 转为列表取 下标 , 字段名
- # ————————19PerfectCRM实现King_admin数据修改————————
- column_obj = obj._meta.get_field(column)#遍历获取 传进的参数对象
- if column_obj.choices:#判断如果字段有choices属性
- #获取choices的字符串(外健)
- get_column_data = getattr(obj,"get_%s_display" % column) #反射,传进的参数对象,拼接字段
- column_data = get_column_data()#函数,拿到数据
- else:
- column_data = getattr(obj, column)#反射,
- # ————————10PerfectCRM实现King_admin日期优化————————
- if type(column_data).__name__ == 'datetime':
- column_data = column_data.strftime('%Y-%m-%d %H-%M-%S')
- # ————————10PerfectCRM实现King_admin日期优化————————
- # ————————19PerfectCRM实现King_admin数据修改————————
- if index == 0: #首列
- # 生成一个链接 跳转到编辑页面 #Format参数是一个格式字符串(%s升级版)
- td_ele = '''<td><a href="/king_admin/{app_name}/{model_name}/{obj_id}/change/">{column_data}</a> </td>'''\
- .format(app_name=admin_obj.model._meta.app_label,
- model_name=admin_obj.model._meta.model_name,
- obj_id=obj.id,
- column_data=column_data)
- else:
- td_ele = '''<td>%s</td>''' % column_data
- # td_ele = '''<td>%s</td>''' % column_data #把反射来的值 拼接字符串 生成<td>
- # ————————19PerfectCRM实现King_admin数据修改————————
- row_ele += td_ele #把 <td> 拼接到上面到空字符串
- else:
- row_ele +="<td>%s</td>" %obj #把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值
- return mark_safe(row_ele) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
- # ————————09PerfectCRM实现King_admin显示注册表的内容————————
- # ————————13PerfectCRM实现King_admin分页页数————————
- #分页功能kingadmin/templates/kingadmin/table_data_list.html里 <a href="?page={{ page }}{% generate_filter_url admin_obj %}">{{ page }}
- @register.simple_tag
- def generate_filter_url(admin_obj): #拼接URL
- url = ''
- for k,v in admin_obj.filter_condtions.items():
- url += "&%s=%s" %(k,v )
- return url
- # ————————13PerfectCRM实现King_admin分页页数————————
- # ————————14PerfectCRM实现King_admin分页的省略显示————————
- #分页的省略显示
- @register.simple_tag
- def pag_omit(request,admin_obj):#传入当前页面值
- rest=''#大字符串
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- search_key = get_search_key(request) # 搜索
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- # ————————17PerfectCRM实现King_admin单列排序————————
- order_by_url = generate_order_by_url(request) # 排序
- # ————————17PerfectCRM实现King_admin单列排序————————
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- filters = generate_filter_url(admin_obj) # 分页
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- add_tags=False#标志位
- for pages in admin_obj.querysets.paginator.page_range:
- # 前两页 或 后 两页 或 当前页的前后页
- if pages < 3 or pages>admin_obj.querysets.paginator.num_pages -2 or abs(admin_obj.querysets.number -pages) <=2:
- #样式
- add_tags=False
- ele_class='' #颜色
- if pages == admin_obj.querysets.number: #--如果是当前页码,颜色加深 不进链接跳转--
- ele_class="active" #颜色加深
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- # ————————17PerfectCRM实现King_admin单列排序————————
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- # rest+='''<li class="%s"><a href="?page=%s">%s</a></li>'''%(ele_class,pages,pages) #--拼接URL--
- # rest+='''<li class="%s"><a href="?page=%s%s">%s</a></li>'''%(ele_class,pages,filters,pages) #--拼接URL--
- # ————————15PerfectCRM实现King_admin多条件过滤————————
- # rest+='''<li class="%s"><a href="?page=%s%s%s">%s<span class="sr-only">(current)</span></a></li>'''\
- # %(ele_class,pages,order_by_url,filters,pages)
- # ————————17PerfectCRM实现King_admin单列排序————————
- rest+='''<li class="%s"><a href="?page=%s%s%s&_q=%s">%s<span class="sr-only">(current)</span></a></li>'''\
- %(ele_class,pages,order_by_url,filters,search_key,pages)
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- else:#其他的用省略号表示
- if add_tags==False:#如果不是标志位的页面
- rest+='<li><a>...</a></li>'
- add_tags=True#标志位为真
- return mark_safe(rest) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
- # ————————14PerfectCRM实现King_admin分页的省略显示————————
- # # ————————15PerfectCRM实现King_admin多条件过滤————————
- # #多条件过滤 table_data_list.html 传递参数
- # @register.simple_tag
- # def get_filter_field (filter_column,admin_obj):
- # print("admin obj",admin_obj.model ,filter_column)
- # field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
- # select_ele = """<select name="%s"> """ %filter_column #拼接成下拉框返回
- # for choice in field_obj.get_choices():#循环获取crm/models里class Customer(models.Model):下source_choices = ((0,'转介绍'),
- # selected_condtion = admin_obj.filter_condtions.get(filter_column)
- # if selected_condtion != None: #if None, 没有过滤这个条件
- # print("heoe....",filter_column,selected_condtion,type(selected_condtion))#类型是 整数
- # if selected_condtion == str(choice[0]): #就是选择的这个条件,整数转字符串
- # selected = "selected"
- # else:
- # selected = ""
- # else:
- # selected = ""
- #
- # #在前端把几个条件提交到后台,后台拿着条件变成一个字典,然后进行过滤,把数据返回前端,并且把条件作为字典返回后端,因为要在前端显示已经过滤的条件。
- # option_ele = """<option value="%s" %s>%s</option> """ % (choice[0],selected,choice[1])
- # select_ele +=option_ele
- # select_ele += "</select>"
- # return mark_safe(select_ele)
- # # ————————15PerfectCRM实现King_admin多条件过滤————————
- # # ————————16PerfectCRM实现King_admin日期过滤————————
- from django.utils.timezone import datetime,timedelta
- @register.simple_tag
- def get_filter_field (filter_column,admin_obj):
- select_ele = """<select name='{filter_column}'><option value="">---------</option>""" #标签 字符串 #拼接成下拉框返回
- field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
- selected = ''
- if field_obj.choices:
- for choice_item in field_obj.choices:
- if admin_obj.filter_condtions.get(filter_column) == str(choice_item[0]):
- selected = "selected"
- select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
- selected = ""
- if type(field_obj).__name__ in "ForeignKey":
- for choice_item in field_obj.get_choices()[1:]:
- if admin_obj.filter_condtions.get(filter_column)== str(choice_item[0]): # 就是选择的这个条件,整数转字符串
- selected = "selected"
- select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
- selected=''
- if type(field_obj).__name__ in ['DateTimeField', 'DateField']: # 如果是时间格式
- date_els = [] # 日期条件项
- today_ele = datetime.now().date() # 今天日期
- date_els.append(['今天', today_ele]) # 今天
- date_els.append(['昨天', today_ele - timedelta(days=1)]) # 昨天
- date_els.append(['近7天', today_ele - timedelta(days=7)]) # 一周
- date_els.append(['近30天', today_ele - timedelta(days=30)]) # 三十
- date_els.append(['本月', today_ele.replace(day=1)]) # 本月
- date_els.append(['近90天', today_ele - timedelta(days=90)]) # 90天
- date_els.append(['近365天', today_ele - timedelta(days=365)]) # 365天
- date_els.append(['本年', today_ele.replace(month=1, day=1)]) ##今年
- for choice_item in date_els:
- if admin_obj.filter_condtions.get("%s__gte" %filter_column)==str(choice_item[1]):
- selected = 'selected'
- select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[1], selected, choice_item[0])
- selected = ''
- filter_column_name = "%s__gte" %filter_column
- else:
- filter_column_name = filter_column
- select_ele += "</select>"
- select_ele=select_ele.format(filter_column=filter_column_name)#格式化时间的判断条件
- return mark_safe(select_ele)
- # ————————16PerfectCRM实现King_admin日期过滤————————
- # ————————17PerfectCRM实现King_admin单列排序————————
- # kingadmin排序功能
- @register.simple_tag
- def get_orderby_key(request,column):
- current_order_by_key = request.GET.get("_o")
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- search_key = request.GET.get("_q")
- if search_key != None:
- if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
- if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
- if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
- return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
- else:
- return "-%s&_q=%s" % (column, search_key)
- return "%s&_q=%s" % (column, search_key)
- else:
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
- if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
- if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
- return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
- else:
- return "-%s"%column
- # else:
- # return column
- # else:
- # return column
- return column #同上4句
- # kingadmin排序功能
- # kingadmin排序功能 显示排序图标
- # @register.simple_tag
- # def display_order_by_icon(request, column):
- # current_order_by_key = request.GET.get("_o")
- # if current_order_by_key != None: #肯定有某列被排序了
- # if current_order_by_key.strip("-") == column: ## 当前这列正在被排序
- # if current_order_by_key.startswith("-"):
- # icon = "fa-arrow-up"
- # else:
- # icon = "fa-arrow-down"
- # ele = """<i class="fa %s" aria-hidden="true"></i>""" % icon
- # return mark_safe(ele)
- # return ''
- # kingadmin排序功能 显示排序图标
- @register.simple_tag
- def display_order_by_icon(request, column):
- current_order_by_key = request.GET.get("_o")
- if current_order_by_key != None: #肯定有某列被排序了
- if current_order_by_key.strip("-") == column: # 当前这列正在被排序 #strip去掉 文本中句子开头与结尾的符号的
- if current_order_by_key.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
- icon = "▲"
- else:
- icon = "▼"
- ele = """<i style='color: red'>%s</i>""" % icon
- return mark_safe(ele)
- return '' #防止出现 None
- # kingadmin排序功能 显示排序图标
- # kingadmin排序功能 # 过滤后排序功能 #}
- @register.simple_tag
- def get_current_orderby_key(request): #注意生成的URL问题
- #获取当前正在排序的字段名 #<input type="hidden" name="_o" value="{% get_current_orderby_key request %}">
- current_order_by_key = request.GET.get("_o")
- return current_order_by_key or ''
- # kingadmin排序功能 # 过滤后排序功能 #}
- # kingadmin排序功能 # 过滤后排序功能 # 排序分页
- @register.simple_tag
- def generate_order_by_url (request):
- current_order_by_key = request.GET.get("_o")
- if current_order_by_key != None: # 肯定有某列被排序了
- return "&_o=%s" % current_order_by_key
- return ''
- # kingadmin排序功能 # 过滤后排序功能 # 排序分页
- # ————————17PerfectCRM实现King_admin单列排序————————
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- @register.simple_tag
- def get_search_key(request): # 搜索框里保留搜索值
- search_key = request.GET.get("_q")
- return search_key or ''
- # ————————18PerfectCRM实现King_admin搜索关键字————————
- # ————————23PerfectCRM实现King_admin数据删除————————
- # <-------------------获取删除映射关系--------------------------------
- @register.simple_tag
- def display_all_related_obj(objs):
- # 取出对象及所有相关联的数据
- from django.db.models.query import QuerySet
- if type(objs) != QuerySet:
- objs = [objs, ]
- if objs:
- model_class = objs[0]._meta.model # 取表对象
- model_name = objs[0]._meta.model_name # 取表名
- return mark_safe(recursive_related_objs_lookup(objs))
- # <-----------------递归获取映射关系--------------------------------
- def recursive_related_objs_lookup(objs, name=None, conn_batch_size=0):
- name = set()
- print(name)
- print('传递过来的objs:', objs)
- # 开始标签的拼接
- ul_ele = "<ul style='color: blue'>"
- for obj in objs:
- li_ele = '''<li>{0}:{1}</li>'''.format(obj._meta.verbose_name, obj.__str__().strip("<>"))
- print('str:', obj.__str__(), '类型:', type(obj.__str__()))
- print('关联的表的自定表名:', li_ele)
- ul_ele += li_ele
- print('拼接li_ele:', ul_ele)
- # 映射关系处理
- # <---------------------------特殊关联处理-----------------------------------
- # 多对多关系
- for m2m_field in obj._meta.local_many_to_many: # local_many_to_many返回列表,many_to_many返回元祖
- print('--开始循环反射-多对多-关系处理--')
- sub_ul_ele = "<ul style='color: red'>"
- m2m_field_obj = getattr(obj, m2m_field.name) # 反射 如果有选项
- print('反射选项:', m2m_field_obj)
- for m2m_data in m2m_field_obj.select_related():
- print('开始循环多对多标签拼接:', m2m_data)
- sub_li_ele = '''<li>{0}:{1}</li>'''.format(m2m_field.verbose_name, m2m_data.__str__().strip("<>"))
- sub_ul_ele += sub_li_ele
- sub_ul_ele += '</ul>'
- ul_ele += sub_ul_ele
- print('生成完整 多对多 标签..:', ul_ele)
- # <---------------------------外健关联处理------------------------------------
- for related_obj in obj._meta.related_objects:
- print('--开始-外健关联-处理--')
- if hasattr(obj, related_obj.get_accessor_name()):
- print('--判断对象中是否包含反查属性--')
- accessor_obj = getattr(obj, related_obj.get_accessor_name())
- print('获取反查对应的对象: ')
- if hasattr(accessor_obj, 'select_related'):
- print('--判断有没有获取数据的方法或属性-- ')
- target_object = accessor_obj.select_related()
- print('获取数据的方法或属性: ', target_object)
- if 'ManyToManyRel' in related_obj.__repr__():
- print('--开始-外健关联-多对多-处理--.')
- # 生成UL
- sub_ul_ele = '<ul style="color: green">'
- for data in target_object:
- print('开始循环-外健关联-标签拼接...', data)
- sub_li_ele = '''<li>{0}:{1}</li>'''.format(data._meta.verbose_name,
- data.__str__().strip("<>"))
- sub_ul_ele += sub_li_ele
- sub_ul_ele += '</ul>'
- ul_ele += sub_ul_ele
- print('-外健关联-生成完整标签:', ul_ele)
- # <---------------递归处理-------------------
- if len(target_object) != conn_batch_size:
- print('--有下级对象存在,进行-递归-循环--')
- names = target_object.__str__()
- print(names, type(names))
- if names == name:
- print('--如果是自己关联自己,就不递归了--')
- ul_ele += '</ul>'
- return ul_ele
- else:
- print('--防止无限递归+1--')
- conn_batch_size = conn_batch_size + 1
- node = recursive_related_objs_lookup(target_object, name=names,
- conn_batch_size=conn_batch_size)
- ul_ele += node
- # <---------------由于使用递归,下面的标签样会发生重复,就不需要使用了--------------------
- else:
- print('外健关联 一对一:', accessor_obj)
- target_object = accessor_obj
- print("外健关联 一对一:", target_object, '属性:', type(target_object))
- ul_ele += '</ul>'
- return ul_ele
- # ————————23PerfectCRM实现King_admin数据删除————————
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- #自定制 actions功能 显示
- @register.simple_tag
- def get_admin_actions(admin_obj):
- #选择功能
- options = "<option class='form-control' value='-1'>-------</option>"#默认为空
- actions = admin_obj.default_actions + admin_obj.actions #默认加自定制
- print('默认加自定制',actions)
- for action in actions:
- action_func = getattr(admin_obj,action)#功能方法 #反射
- if hasattr(action_func,"short_description"):#反射 如有自定义的名称执行函数方法
- action_name = action_func.short_description#等于自定义的名称 #显示中文
- else:
- action_name = action#等于函数名称
- options += """<option value="{action_func_name}">{action_name}</option> """.format(action_func_name=action, action_name=action_name)
- return mark_safe(options)
- # ————————24PerfectCRM实现King_admin自定义操作数据————————
- # ————————27PerfectCRM实现King_admin编辑复选框————————
- # 复选 框内容待选数据
- @register.simple_tag
- def get_m2m_available_objs(admin_obj, field_name):
- '''返回m2m左侧所有待选数据'''
- # c= admin_obj.model.tags.rel.model.objects.all()
- # print('c',c)
- # m2m_objs= admin_obj.model.tags.rel.model.objects.all()
- # print('m2m_objs',m2m_objs)
- m2m_model = getattr(admin_obj.model, field_name).rel # 复选框对象
- m2m_objs = m2m_model.model.objects.all() # 获取到复选框所有内容
- return m2m_objs
- # 复选 框内容已选中数据
- @register.simple_tag
- def get_m2m_chosen_objs(admin_obj, field_name, obj):
- """
- 返回已选中的列表
- :param admin_obj:
- :param field_name:
- :param obj: 数据对象
- :return:
- """
- # print(["--->obj",obj])
- if obj.id:
- return getattr(obj, field_name).all() # 返回所有的内容
- return [] # 没有数据为返回空 创建新的记录使用
- # ————————27PerfectCRM实现King_admin编辑复选框————————
#kingadmin_tags.py
Django项目:CRM(客户关系管理系统)--35--27PerfectCRM实现King_admin编辑复选框的更多相关文章
- Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- Django项目:CRM(客户关系管理系统)--58--48PerfectCRM实现CRM客户报名流程学生合同
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
#base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...
- Django项目:CRM(客户关系管理系统)--67--57PerfectCRM实现admin批量生成上课记录
#admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...
- Django项目:CRM(客户关系管理系统)--65--55PerfectCRM实现CRM客户报名状态颜色变化
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- Django项目:CRM(客户关系管理系统)--64--54PerfectCRM实现CRM客户报名链接
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- Django项目:CRM(客户关系管理系统)--43--35PerfectCRM实现CRM重写Admin密码修改
#admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...
随机推荐
- Lua程序设计之字符串精要
(摘自Lua程序设计) 基本: Lua语言的字符串是一串字节组成的序列. 在Lua语言中,字符使用8个比特位来存储. Lua语言中的字符串可以存储包括空字符在内的所有数值代码,这意味着我们可以在字符串 ...
- Android开发 TextView的开发记录
前言 此篇博客是记录一些TextView开发上一些少用的开发功能项.目前开发记录如下: 添加图片 文字滚动 添加省略号 实现长文的收起和展开功能 改变一个字符串里自定字符的颜色或者大小 效果字体(粗体 ...
- [转]C#多线程学习 之 线程池[ThreadPool]
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPo ...
- 使用log4j实现日志API
添加SLF4J依赖,用于提供日志API, 使用log4j作为实现 1.pom.xml添加SLF4J依赖 <!-- SLF4J --> <dependency> <grou ...
- Apache Flink 进阶入门(二):Time 深度解析
前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction.中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层 ...
- 漫说安全|智能的云WAF,开挂的Web防御
“漫说安全”是我们推出的一个新栏目,以简洁明了的形式展现高深晦涩的云安全. 今天我们要讲的是智能的云WAF到底有啥“本领”,答案就在漫画里^_^ 漫画看完后估计你还会有些小疑问,不要着急,安全君特意准 ...
- 集合划分——cf1028D思维题
非常思维的一道题目,题意很长 给定s1,s2两个集合,s1维护最大值,s2维护最小值,s1的所有元素要比s2小 操作1:往两个集合里的任意一个添加x 操作2:把x从所在的集合里删掉:要求被删的x必须是 ...
- 菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t[转]
菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
- momentjs 使用总结
一.安装 cnpm install moment 二.引入 var moment = require('moment') 三.使用 let today = moment().format('YYYY- ...
- pycharm优化
一.版本选择 建议安装5.0版本,因为好注册,这个你懂得. 下载地址: https://confluence.jetbrains.com/display/PYH/Previous+PyCharm+Re ...