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 ...
随机推荐
- 小程序中template的用法
demo案例: wxml代码: <view> <text>template使用demo</text> <!-- <view wx:for="{ ...
- 完全卸载之前8.0的Mysql,安装5.5mysql
完全卸载: https://blog.csdn.net/sxingming/article/details/52601250 安装mysql5.5: https://blog.csdn.net/fly ...
- input 的 placeholder 样式修改
input::-webkit-input-placeholder{ color:#999999; } input::-moz-placeholder{ /* Mozilla Firefox 19+ * ...
- 07-img和a标签
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- File- Linux必学的60个命令
1.作用 件内容判断文件类型,使用权限是所有用户. 2.格式 file通过探测文 file [options] 文件名 3.[options]主要参数 -v:在标准输出后显示版本信息,并且退出. -z ...
- Hbase实验:java创建和删除table
开启zookeeper.hadoop.hbase: 打开eclipse创一个java project,然后导入所需jar包: 写好java代码,运行create,然后去hbase shell里查看: ...
- codeforces600E. Lomsat gelral(dsu on tree)
dsu on tree先分轻重儿子先处理轻边,再处理重儿子再加上轻儿子的答案 #include<iostream> #include<cstdio> #include<q ...
- Java8的HashMap笔记摘要
问题例子: HashMap 是不是有序的? 不是有序的. 有没有有序的Map实现类呢? 有 TreeMap 和 LinkedHashMap. TreeMap 和 LinkedHashMap 是如何保 ...
- NOIP2016提高A组 A题 礼物—概率状压dp
题目描述 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生 日礼物. 商店里一共有n种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会 ...
- uni-app中不使用scroll-view组件,监听页面滑直底部事件
最终达到的目标效果 将要用到 监听页面滚动事件:onPageScroll 获取节点信息uni.createSelectorQuery() 标签布局 <template> <view ...