1. #admin.py
  2.  
  3. # ————————01PerfectCRM基本配置ADMIN————————
  4.  
  5. from django.contrib import admin
  6. # Register your models here.
  7. from crm import models #从crm导入models
  8.  
  9. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  10. from django.shortcuts import render
  11. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  12.  
  13. # ————————04PerfectCRM实现King_admin注册功能————————
  14. class CustomerAdmin(admin.ModelAdmin):#定制Djanago admin
  15. list_display = ('id','qq','source','consultant','content','date')#显示字段表头
  16. # ————————11PerfectCRM实现King_admin分页显示条数————————
  17. list_per_page = 2 #分页条数
  18. # ————————11PerfectCRM实现King_admin分页显示条数————————
  19. # ————————16PerfectCRM实现King_admin日期过滤————————
  20. # ————————15PerfectCRM实现King_admin多条件过滤————————
  21. # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
  22. # list_filter = ('source','consultant','consult_courses',)
  23. list_filter = ('date','source','consultant','consult_courses',)
  24. # ————————15PerfectCRM实现King_admin多条件过滤————————
  25. # ————————16PerfectCRM实现King_admin日期过滤————————
  26. # ————————18PerfectCRM实现King_admin搜索关键字————————
  27. #搜索(不能包含CharField)(注意加 逗号 , )
  28. search_fields = ('name','qq',)
  29. # ————————18PerfectCRM实现King_admin搜索关键字————————
  30.  
  31. # ————————26PerfectCRM实现King_admin自定义排序————————
  32. ordering = ['-qq'] #自定义排序,默认'-id'
  33. # ————————26PerfectCRM实现King_admin自定义排序————————
  34.  
  35. # ————————27PerfectCRM实现King_admin编辑复选框————————
  36. filter_horizontal = ('tags',) #复选框
  37. # ————————27PerfectCRM实现King_admin编辑复选框————————
  38.  
  39. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  40. # from django.shortcuts import render
  41. actions = ['test_actions',]#定制功能 #测试返回到一个新页面
  42. def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容
  43. return render(request,"king_admin/table_index.html")
  44. test_actions.short_description = "测试显示中文"
  45. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  46.  
  47. # ————————04PerfectCRM实现King_admin注册功能————————
  48.  
  49. #注册到 Django Admin里
  50. admin.site.register(models.Branch) #01校区表
  51. admin.site.register(models.ClassList) #02班级表
  52. admin.site.register(models.Course) #03课程表,可以报名那些课程
  53.  
  54. # ————————04PerfectCRM实现King_admin注册功能————————
  55. # admin.site.register(models.Customer) #04客户信息表
  56. admin.site.register(models.Customer,CustomerAdmin) #04客户信息表
  57. # ————————04PerfectCRM实现King_admin注册功能————————
  58.  
  59. admin.site.register(models.CustomerFollowUp) #05客户跟进表
  60. admin.site.register(models.Enrollment) #06学员报名信息表
  61. admin.site.register(models.Payment) #07缴费记录表
  62. admin.site.register(models.CourseRecord) #08每节课上课纪录表
  63. admin.site.register(models.StudyRecord) #09学习纪录
  64. admin.site.register(models.UserProfile) #10账号表
  65. admin.site.register(models.Role) #11角色表
  66. admin.site.register(models.Tag) #12标签表
  67.  
  68. '''
  69. Django Admin里账号密码重置方法
  70. #运行 Terminal
  71.  
  72. python manage.py createsuperuser
  73.  
  74. Username : admin
  75. Email address: admin@qq.com
  76. Password: admin123456
  77. Password (again): admin123456
  78.  
  79. 英文转中文方法
  80. 到settings.py里修改
  81. # LANGUAGE_CODE = 'en-us'
  82. LANGUAGE_CODE = 'zh-Hans'
  83. '''
  84.  
  85. # ————————01PerfectCRM基本配置ADMIN————————

#admin.py

  1. # kingadmin.py
  2. # ————————04PerfectCRM实现King_admin注册功能————————
  3. from crm import models
  4. #print("kingadmin crm",models.Customer)
  5.  
  6. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  7. # from king_admin.base_admin import register,BaseAdmin
  8. from king_admin.base_admin import site,BaseAdmin
  9. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  10.  
  11. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  12. from django.shortcuts import render
  13. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  14.  
  15. #04客户信息表
  16. class CustomerAdmin(BaseAdmin):#定制Djanago admin
  17. list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date') # 显示字段表头
  18.  
  19. # ————————11PerfectCRM实现King_admin分页显示条数————————
  20. list_per_page = 2 #分页条数 # 默认分页条数10
  21. # ————————11PerfectCRM实现King_admin分页显示条数————————
  22.  
  23. # ————————16PerfectCRM实现King_admin日期过滤————————
  24. # ————————15PerfectCRM实现King_admin多条件过滤————————
  25. # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
  26. # list_filter = ('source','consultant','consult_courses',)
  27. list_filter = ('date','source','consultant','consult_courses',)
  28. # ————————15PerfectCRM实现King_admin多条件过滤————————
  29. # ————————16PerfectCRM实现King_admin日期过滤————————
  30.  
  31. # ————————18PerfectCRM实现King_admin搜索关键字————————
  32. #搜索(不能包含CharField)(注意加 逗号 , )
  33. search_fields = ('name','qq',)
  34. # ————————18PerfectCRM实现King_admin搜索关键字————————
  35.  
  36. # ————————26PerfectCRM实现King_admin自定义排序————————
  37. ordering = '-qq' #自定义排序,默认'-id'
  38. # ————————26PerfectCRM实现King_admin自定义排序————————
  39.  
  40. # ————————27PerfectCRM实现King_admin编辑复选框————————
  41. filter_horizontal = ('tags',) #复选框
  42. # ————————27PerfectCRM实现King_admin编辑复选框————————
  43.  
  44. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  45. # from django.shortcuts import render
  46. actions = ['test_actions',]#定制功能 #测试返回到一个新页面
  47. def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容
  48. return render(request,"king_admin/table_index.html")
  49. test_actions.short_description = "测试显示中文"
  50. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  51.  
  52. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  53. # register(models.Customer,CustomerAdmin)
  54. # register(models.CourseRecord)
  55. site.register(models.Customer,CustomerAdmin)
  56. site.register(models.CourseRecord)
  57. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  58.  
  59. # ————————04PerfectCRM实现King_admin注册功能————————

# kingadmin.py

  1. #base_admin.py
  2.  
  3. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  4. from django.shortcuts import render,redirect
  5. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  6.  
  7. # ————————04PerfectCRM实现King_admin注册功能————————
  8.  
  9. #Django admin 注册功能的形式
  10. # sites = {
  11. # 'crm':{
  12. # 'customers':CustomerAdmin,
  13. # 'customerfollowup':CustomerFollowUPAdmin,
  14. # }
  15. # }
  16.  
  17. class AdminRegisterException(Exception): #自定义异常
  18. def __init__(self,msg):
  19. self.message = msg
  20.  
  21. class BaseAdmin(object):#自定义方法
  22. list_display = () #显示的字段(不能包含ManyToManyField)
  23.  
  24. # ————————11PerfectCRM实现King_admin分页显示条数————————
  25. list_per_page = 10 # 默认分页条数10
  26. # ————————11PerfectCRM实现King_admin分页显示条数————————
  27.  
  28. # ————————15PerfectCRM实现King_admin多条件过滤————————
  29. list_filter = () # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
  30. # ————————15PerfectCRM实现King_admin多条件过滤————————
  31.  
  32. # ————————18PerfectCRM实现King_admin搜索关键字————————
  33. search_fields = () #搜索(不能包含CharField)(注意加 逗号 , )
  34. # ————————18PerfectCRM实现King_admin搜索关键字————————
  35.  
  36. # ————————26PerfectCRM实现King_admin自定义排序————————
  37. ordering = None #自定义排序
  38. # ————————26PerfectCRM实现King_admin自定义排序————————
  39.  
  40. # ————————27PerfectCRM实现King_admin编辑复选框————————
  41. filter_horizontal = []#复选框
  42. # ————————27PerfectCRM实现King_admin编辑复选框————————
  43.  
  44. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  45. actions = []#自定功能
  46.  
  47. default_actions = ["delete_selected",] #默认删除的函数
  48. #默认删除的函数
  49. def delete_selected(self,request,queryset):
  50. # from django.shortcuts import render, redirect
  51. print("goint to delete ",queryset)
  52. app_name=self.model._meta.app_label#app名
  53. model_name=self.model._meta.model_name#表名
  54. objs=queryset#类对象
  55. action=request._admin_action
  56. print(action,'<-------action')
  57. if request.POST.get('delete_confirm')=='yes': #{#table_delete.html#}
  58. queryset.delete()
  59. return redirect('/king_admin/%s/%s/'%(app_name,model_name))
  60. selected_ids=','.join([str(i.id) for i in queryset])
  61. print(selected_ids,'<---selected_ids')
  62. objs=queryset
  63. return render(request,"king_admin/table_delete.html", locals()) #返回删除页
  64. delete_selected.short_description = "默认批量删除"
  65. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  66.  
  67. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  68. class AdminSite(object):
  69. def __init__(self):
  70. self.registered_sites = {} #传到views 里调用
  71. def register(self,model,admin_class=None): #默认值None 使用 BaseAdmin
  72. app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
  73. model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
  74. if app_name not in self.registered_sites:
  75. self.registered_sites[app_name] = {} #创建 crm={}
  76. if model_name in self.registered_sites[app_name]:
  77. raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
  78. %(app_name,model_name))#自定义异常,
  79. if not admin_class:
  80. admin_class = BaseAdmin #默认值None 使用 BaseAdmin
  81. # self.registered_sites[app_name][model_name] = admin_class #注册APP
  82. # site = AdminSite() # 实例化类 单例模式
  83.  
  84. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  85. #registered_sites {'crm': {'customer': <class 'crm.kingadmin.CustomerAdmin'>, 'courserecord': <class 'kingadmin.base_admin.BaseAdmin'>}}
  86. #把类名放到class的对象里,然后通过class的对象传到前端
  87. # admin_class.model = model
  88. # self.registered_sites[app_name][model_name] = admin_class #注册APP
  89. #
  90. # site = AdminSite() #实例化类 单例模式
  91. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  92.  
  93. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  94. #没有实例化会使用同一个内存地址
  95. admin_obj = admin_class() #先实例化
  96. admin_obj.model = model #参数赋值给实例
  97. self.registered_sites[app_name][model_name] = admin_obj#注册APP
  98. #实例化后,调用会使用不同的内存地址
  99.  
  100. site = AdminSite() #实例化类 单例模式
  101. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  102.  
  103. # registered_sites={}
  104. # def register(model,admin_class=None): #默认值None 使用 BaseAdmin
  105. # app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
  106. # model_name = model._meta.model_name#用内置方法获取 表名 (Customer)
  107. # if app_name not in registered_sites:
  108. # registered_sites[app_name] = {} #创建 crm={}
  109. # if model_name in registered_sites[app_name]:
  110. # raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
  111. # %(app_name,model_name))#自定义异常
  112. # if not admin_class:
  113. # admin_class = BaseAdmin #默认值None 使用class BaseAdmin
  114. # registered_sites[app_name][model_name] = admin_class #注册APP
  115.  
  116. # ————————05PerfectCRM实现King_admin注册功能获取内存————————
  117.  
  118. # ————————04PerfectCRM实现King_admin注册功能————————

#base_admin.py

  1. {#table_change.html#}
  2. {## ————————19PerfectCRM实现King_admin数据修改————————#}
  3. {#{% extends "king_master/king_index.html" %}#}
  4. {##}
  5. {#{% load kingadmin_tags %}#}
  6. {#{% block right-container-content %}#}
  7. {##}
  8. {# {{ obj_form }}#}
  9. {##}
  10. {#{% endblock %}#}
  11. {## ————————19PerfectCRM实现King_admin数据修改————————#}
  12.  
  13. {## ————————20PerfectCRM实现King_admin数据修改美化————————#}
  14. {% extends 'king_master/king_index.html' %} {#继承模板#}
  15. {% load kingadmin_tags %} {#通过自己定义标签获取中文,Django中利用filtersimple_tag为前端自定义函数的实现方法#}
  16.  
  17. {% block right-container-content %}
  18. <div class="row" style="margin-bottom: 20px" >
  19. <ol class="breadcrumb">
  20. <li><a href="/king_admin/">主页</a></li>
  21. <li><a href="/king_admin/{% get_app_name admin_obj.model %}/">{% get_app_name admin_obj.model %}</a></li>
  22. <li><a href="/king_admin/{% get_app_name admin_obj.model %}/{% get_model_name admin_obj.model %}/">
  23. {% get_model_verbose_name admin_obj.model %} </a></li>
  24. {% if not admin_obj.is_add_form %} {# 新建时 ForeignKey不能实例化 #}
  25. <li class="active">{{ obj_form.instance }}</li> {# 修改时 实例化 #}
  26. {% endif %}
  27. </ol>
  28. {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
  29. {# <h4>修改:{% get_model_verbose_name admin_obj.model %}</h4>#}
  30.  
  31. {% block Tops %}
  32. <div class="panel panel-info">
  33. <h4 style='color: red'>修改: {% get_model_verbose_name admin_obj.model %}</h4>
  34. </div>
  35. {% endblock %}
  36. {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
  37. </div>
  38.  
  39. <div class="row">
  40. {{ obj_form.errors }}
  41.  
  42. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  43. {#<form class="form-horizontal" method="post" >{% csrf_token %}#}
  44. <form class="form-horizontal" method="post" onsubmit="return BeforeFormSubmit(this);">{% csrf_token %}
  45. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  46.  
  47. {% for field in obj_form %}
  48. <div class="form-group">
  49. <label class="col-sm-2 " style="font-weight: normal"> {#字体#}
  50. {% if field.field.required %} {#required判断是不是必须填写#}
  51. <b>{{ field.label }}</b>
  52. {% else %}
  53. {{ field.label }}
  54. {% endif %}
  55.  
  56. </label>
  57. <div class="col-sm-10" >
  58. <span style="color: red;">{{ field.errors }}</span>
  59.  
  60. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  61. {# {{ field }}#}
  62. {% if field.name in admin_obj.filter_horizontal %} <!-- 水平--><!-- 判断是否复选框-->
  63. {% get_m2m_chosen_objs admin_obj field.name obj_form.instance as m2m_chosen_objs %} <!--当前对象已经选中的字段名-->
  64. <!-- 左边待选框-->
  65. <div class="col-md-6">
  66. <!-- 取所有的内容-->
  67. {% get_m2m_available_objs admin_obj field.name as m2m_available_objs %}
  68. {# <input type="text" oninput="FuzzSearch(this,'id_{{ field.name }}_from')" class="form-control">#}
  69. <!-- 字段名-->
  70. <select multiple field_name="{{ field.name }}" class="form-control filter-select-box" id="id_{{ field.name }}_from" >
  71. <!-- 字段名 是否为不能修改-->
  72. {% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
  73. {% for obj in m2m_available_objs %}
  74. {% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
  75. <option value="{{ obj.id }}" disabled>{{ obj }}</option>
  76. {% endif %}
  77. {% endfor %}
  78. {% else %}
  79. {% for obj in m2m_available_objs %}
  80. {% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
  81. <option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_to')">{{ obj }}</option>
  82. {% endif %}
  83. {% endfor %}
  84. {% endif %}
  85. </select>
  86. </div>
  87. <!-- 中间箭头-->
  88. <div class="col-md-1">
  89. <div><h4 style='color: #00ff06'>待选 -> </h4></div>
  90. <div><h4 style='color: #8dffc5'>双击选择 </h4></div>
  91. <div><h4 style='color: #ff0003'> <- 已选 </h4></div>
  92. </div>
  93.  
  94. <!-- 右边已选框-->
  95. <div class="col-md-5">
  96. <select m2m_right="yes" name="{{ field.name }}" multiple field_name="{{ field.name }}" class="form-control" id="id_{{ field.name }}_to">
  97. {% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
  98. {% for obj in m2m_chosen_objs %}
  99. <option value="{{ obj.id }}" disabled>{{ obj }}</option>
  100. {% endfor %}
  101. {% else %}
  102.  
  103. {% for obj in m2m_chosen_objs %}
  104. <option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_from')">{{ obj }}</option>
  105. {% endfor %}
  106. {% endif %}
  107. </select>
  108.  
  109. </div>
  110.  
  111. {% else %}
  112. {{ field }} <span style="color: #bce8f1"> {{ field.help_text }}</span>
  113. {# <span style="color:red">{{ field.errors }}</span>#}
  114. {% endif %} <!-- 判断是否复选框-->
  115. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  116.  
  117. </div>
  118. </div>
  119. {% endfor %}
  120.  
  121. {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
  122. {## ————————23PerfectCRM实现King_admin数据删除————————#}
  123. {# <a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>#}
  124. {## ————————23PerfectCRM实现King_admin数据删除————————#}
  125. {# <input type="submit" value="保存" class="pull-right btn btn-info" > {#放右边#}
  126.  
  127. <div class="form-group">
  128. {% block del %}
  129. <div class="col-sm-2">
  130. <a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>
  131. </div>
  132. {% endblock %}
  133. <div class="col-sm-10">
  134. <input type="submit" value="保存" class="pull-right btn btn-info">
  135. </div>
  136. </div>
  137. {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
  138.  
  139. </form>
  140. </div>
  141.  
  142. {% endblock %}
  143. {## ————————20PerfectCRM实现King_admin数据修改美化————————#}

{#table_change.html#}

  1. {#king_base.html#}
  2. {## ————————02PerfectCRM创建ADMIN页面————————#}
  3. {#模板文件 king_base.html#}
  4. <!DOCTYPE html>
  5. <html lang="zh-CN">
  6. <head>
  7. {# <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。#}
  8. {# <meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。#}
  9. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  11. <meta name="viewport" content="width=device-width, initial-scale=1">
  12. <meta name="description" content="">
  13. <meta name="author" content="">
  14.  
  15. <link rel="icon" href="/static/king_img/king_logo.jpg">{# icon,指的是图标 #}
  16. <title>KingAdmin</title> {# 页面头部显示#}
  17.  
  18. {# 使用link来调用外部的css文件#}
  19. <link rel="stylesheet" href="/static/king_css/bootstrap.css" /> {#导航栏样式#}
  20. <link rel="stylesheet" href="/static/king_css/dashboard.css" /> {#指示板样式#}
  21.  
  22. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  23. <link rel="stylesheet" href="/static/king_css/king_admin_change.css" /> {#编辑复选框样式#}
  24. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  25.  
  26. </head>
  27.  
  28. <body>
  29.  
  30. {% block body %}{#自定义内容 body#}{% endblock %}
  31.  
  32. {# 将纯JavaScript的语句另外保存在一个"*.js"的文件中,需要时再调用。#}
  33. <script src="/static/king_js/jquery.js"></script> {# jQuery 是一个 JavaScript库,极大地简化了 JavaScript 编程。#}
  34. <script src="/static/king_js/bootstrap.js"></script> {#指示板JS事件#}
  35.  
  36. {## ————————24PerfectCRM实现King_admin自定义操作数据————————#}
  37. <script src="/static/king_js/king_admin_js.js"></script> {#自定义JS事件#}
  38. {## ————————24PerfectCRM实现King_admin自定义操作数据————————#}
  39.  
  40. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  41. <script src="/static/king_js/king_admin_change.js"></script> {#编辑复选框JS事件#}
  42. {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
  43.  
  44. </body>
  45. </html>
  46.  
  47. {## ————————02PerfectCRM创建ADMIN页面————————#}

{#king_base.html#}

  1. /*king_admin_change.css*/
  2.  
  3. /*# ————————27PerfectCRM实现King_admin编辑复选框————————*/
  4. .filter-select-box{
  5. height: 230px;!important;
  6. width:100%;
  7. }
  8.  
  9. /*# ————————27PerfectCRM实现King_admin编辑复选框————————*/

/*king_admin_change.css*/

  1. // king_admin_change.js
  2. // # ————————27PerfectCRM实现King_admin编辑复选框————————
  3. function BeforeFormSubmit(form_ele) {
  4.  
  5. console.log(form_ele);
  6. //$('form input[disabled]').prop("disabled", false);//修改为可提交
  7. $("form").find("[disabled]").removeAttr("disabled");//修改为 可提交
  8.  
  9. $('select[m2m_right="yes"] option').prop('selected', true);
  10.  
  11. return true;
  12. }
  13.  
  14. function MoveEleTo(from_ele, target_ele_id) {
  15. //move options from from_ele to target ele
  16. var field_name = $(from_ele).parent().attr("field_name");//获option名
  17. if (target_ele_id.endsWith('_from')) {//判断是否
  18. var new_target_id = "id_" + field_name + "_to";
  19. } else {
  20. var new_target_id = "id_" + field_name + "_from";
  21. }
  22. //创建一个新标签
  23. var opt_ele = "<option value='" + $(from_ele).val() + "' ondblclick=MoveEleTo(this,'" + new_target_id + "') >" + $(from_ele).text() + "</option>";
  24. $("#" + target_ele_id).append(opt_ele);//添加到另一边选框
  25. $(from_ele).remove();//移除选中的
  26.  
  27. }
  28.  
  29. // # ————————27PerfectCRM实现King_admin编辑复选框————————

// king_admin_change.js

  1. #kingadmin_tags.py
  2.  
  3. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  4.  
  5. # # 因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
  6. # from django import template #模板
  7. # register = template.Library() #模板库
  8. #
  9. # @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
  10. # def get_app_name(model_obj):
  11. #
  12. # # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  13. # # return model_obj._meta.verbose_name_plural
  14. # '''
  15. # #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
  16. # class Meta:
  17. # verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
  18. # verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
  19. # '''
  20. # model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
  21. # if not model_name:
  22. # model_name = model_obj._meta.model_name
  23. #
  24. # return model_name
  25. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  26.  
  27. # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
  28.  
  29. # ————————07PerfectCRM实现King_admin显示注册的表————————
  30. #因为前端禁止使用下划线开头(_meta.verbose_name ),所以通过后端处理后返回前端。
  31. from django import template #模板
  32. register = template.Library() #模板库
  33.  
  34. @register.simple_tag #Django中利用filter与simple_tag为前端自定义函数的实现方法
  35. def get_model_verbose_name(model_obj):
  36. '''
  37. #判断 数据库 里如果有 verbose_name 或者 verbose_name_plural 就 调用 如果都没有 就使用默认的(英文)
  38. class Meta:
  39. verbose_name = "04客户信息表" #在 Django Admin 里 表名显示中文 但是会加s
  40. verbose_name_plural = "04客户信息表" #在 Django Admin 里 表名显示中文 不会加s
  41. '''
  42. model_name = model_obj._meta.verbose_name_plural if model_obj._meta.verbose_name else model_obj._meta.verbose_name_plural
  43. if not model_name:
  44. model_name = model_obj._meta.model_name
  45. return model_name
  46.  
  47. @register.simple_tag
  48. def get_model_name(model_obj):
  49. return model_obj._meta.model_name
  50. @register.simple_tag
  51. def get_app_name(model_obj):
  52. return model_obj._meta.app_label
  53. # ————————07PerfectCRM实现King_admin显示注册的表————————
  54.  
  55. # ————————09PerfectCRM实现King_admin显示注册表的内容————————
  56. from django.utils.safestring import mark_safe #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  57. @register.simple_tag
  58. def build_table_row(admin_obj,obj):#通过kingadmin_tags在后台处理 再传到前端
  59. row_ele = "" #为了生成一整行返回前端
  60. if admin_obj.list_display:#如果不为空,有在crm/kingadmin.py注册site.register(models.Customer,CustomerAdmin)
  61.  
  62. # ————————19PerfectCRM实现King_admin数据修改————————
  63. #循环所有 要显示 的字符串 进行反射 展示 字段
  64. # for column in admin_obj.list_display: #循环base_admin里class BaseAdmin下list_display = ()
  65. for index, column in enumerate(admin_obj.list_display): # 转为列表取 下标 , 字段名
  66. # ————————19PerfectCRM实现King_admin数据修改————————
  67.  
  68. column_obj = obj._meta.get_field(column)#遍历获取 传进的参数对象
  69. if column_obj.choices:#判断如果字段有choices属性
  70. #获取choices的字符串(外健)
  71. get_column_data = getattr(obj,"get_%s_display" % column) #反射,传进的参数对象,拼接字段
  72. column_data = get_column_data()#函数,拿到数据
  73. else:
  74. column_data = getattr(obj, column)#反射,
  75. # ————————10PerfectCRM实现King_admin日期优化————————
  76. if type(column_data).__name__ == 'datetime':
  77. column_data = column_data.strftime('%Y-%m-%d %H-%M-%S')
  78. # ————————10PerfectCRM实现King_admin日期优化————————
  79.  
  80. # ————————19PerfectCRM实现King_admin数据修改————————
  81.  
  82. if index == 0: #首列
  83. # 生成一个链接 跳转到编辑页面 #Format参数是一个格式字符串(%s升级版)
  84. td_ele = '''<td><a href="/king_admin/{app_name}/{model_name}/{obj_id}/change/">{column_data}</a> </td>'''\
  85. .format(app_name=admin_obj.model._meta.app_label,
  86. model_name=admin_obj.model._meta.model_name,
  87. obj_id=obj.id,
  88. column_data=column_data)
  89. else:
  90. td_ele = '''<td>%s</td>''' % column_data
  91. # td_ele = '''<td>%s</td>''' % column_data #把反射来的值 拼接字符串 生成<td>
  92. # ————————19PerfectCRM实现King_admin数据修改————————
  93. row_ele += td_ele #把 <td> 拼接到上面到空字符串
  94. else:
  95. row_ele +="<td>%s</td>" %obj #把<td>拼接到上面到空字符串,crm/models.py里 def __str__(self):的返回值
  96. return mark_safe(row_ele) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  97. # ————————09PerfectCRM实现King_admin显示注册表的内容————————
  98.  
  99. # ————————13PerfectCRM实现King_admin分页页数————————
  100. #分页功能kingadmin/templates/kingadmin/table_data_list.html里 <a href="?page={{ page }}{% generate_filter_url admin_obj %}">{{ page }}
  101. @register.simple_tag
  102. def generate_filter_url(admin_obj): #拼接URL
  103. url = ''
  104. for k,v in admin_obj.filter_condtions.items():
  105. url += "&%s=%s" %(k,v )
  106. return url
  107. # ————————13PerfectCRM实现King_admin分页页数————————
  108.  
  109. # ————————14PerfectCRM实现King_admin分页的省略显示————————
  110. #分页的省略显示
  111. @register.simple_tag
  112. def pag_omit(request,admin_obj):#传入当前页面值
  113. rest=''#大字符串
  114. # ————————18PerfectCRM实现King_admin搜索关键字————————
  115. search_key = get_search_key(request) # 搜索
  116. # ————————18PerfectCRM实现King_admin搜索关键字————————
  117. # ————————17PerfectCRM实现King_admin单列排序————————
  118. order_by_url = generate_order_by_url(request) # 排序
  119. # ————————17PerfectCRM实现King_admin单列排序————————
  120. # ————————15PerfectCRM实现King_admin多条件过滤————————
  121. filters = generate_filter_url(admin_obj) # 分页
  122. # ————————15PerfectCRM实现King_admin多条件过滤————————
  123. add_tags=False#标志位
  124. for pages in admin_obj.querysets.paginator.page_range:
  125. # 前两页 或 后 两页 或 当前页的前后页
  126. if pages < 3 or pages>admin_obj.querysets.paginator.num_pages -2 or abs(admin_obj.querysets.number -pages) <=2:
  127. #样式
  128. add_tags=False
  129. ele_class='' #颜色
  130. if pages == admin_obj.querysets.number: #--如果是当前页码,颜色加深 不进链接跳转--
  131. ele_class="active" #颜色加深
  132. # ————————18PerfectCRM实现King_admin搜索关键字————————
  133. # ————————17PerfectCRM实现King_admin单列排序————————
  134. # ————————15PerfectCRM实现King_admin多条件过滤————————
  135. # rest+='''<li class="%s"><a href="?page=%s">%s</a></li>'''%(ele_class,pages,pages) #--拼接URL--
  136. # rest+='''<li class="%s"><a href="?page=%s%s">%s</a></li>'''%(ele_class,pages,filters,pages) #--拼接URL--
  137. # ————————15PerfectCRM实现King_admin多条件过滤————————
  138. # rest+='''<li class="%s"><a href="?page=%s%s%s">%s<span class="sr-only">(current)</span></a></li>'''\
  139. # %(ele_class,pages,order_by_url,filters,pages)
  140. # ————————17PerfectCRM实现King_admin单列排序————————
  141. rest+='''<li class="%s"><a href="?page=%s%s%s&_q=%s">%s<span class="sr-only">(current)</span></a></li>'''\
  142. %(ele_class,pages,order_by_url,filters,search_key,pages)
  143. # ————————18PerfectCRM实现King_admin搜索关键字————————
  144. else:#其他的用省略号表示
  145. if add_tags==False:#如果不是标志位的页面
  146. rest+='<li><a>...</a></li>'
  147. add_tags=True#标志位为真
  148. return mark_safe(rest) #使用mark_safe函数标记后,django将不再对该函数的内容进行转义
  149.  
  150. # ————————14PerfectCRM实现King_admin分页的省略显示————————
  151.  
  152. # # ————————15PerfectCRM实现King_admin多条件过滤————————
  153. # #多条件过滤 table_data_list.html 传递参数
  154. # @register.simple_tag
  155. # def get_filter_field (filter_column,admin_obj):
  156. # print("admin obj",admin_obj.model ,filter_column)
  157. # field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
  158. # select_ele = """<select name="%s"> """ %filter_column #拼接成下拉框返回
  159. # for choice in field_obj.get_choices():#循环获取crm/models里class Customer(models.Model):下source_choices = ((0,'转介绍'),
  160. # selected_condtion = admin_obj.filter_condtions.get(filter_column)
  161. # if selected_condtion != None: #if None, 没有过滤这个条件
  162. # print("heoe....",filter_column,selected_condtion,type(selected_condtion))#类型是 整数
  163. # if selected_condtion == str(choice[0]): #就是选择的这个条件,整数转字符串
  164. # selected = "selected"
  165. # else:
  166. # selected = ""
  167. # else:
  168. # selected = ""
  169. #
  170. # #在前端把几个条件提交到后台,后台拿着条件变成一个字典,然后进行过滤,把数据返回前端,并且把条件作为字典返回后端,因为要在前端显示已经过滤的条件。
  171. # option_ele = """<option value="%s" %s>%s</option> """ % (choice[0],selected,choice[1])
  172. # select_ele +=option_ele
  173. # select_ele += "</select>"
  174. # return mark_safe(select_ele)
  175. # # ————————15PerfectCRM实现King_admin多条件过滤————————
  176.  
  177. # # ————————16PerfectCRM实现King_admin日期过滤————————
  178. from django.utils.timezone import datetime,timedelta
  179. @register.simple_tag
  180. def get_filter_field (filter_column,admin_obj):
  181. select_ele = """<select name='{filter_column}'><option value="">---------</option>""" #标签 字符串 #拼接成下拉框返回
  182. field_obj = admin_obj.model._meta.get_field(filter_column)#调用内置方法
  183. selected = ''
  184. if field_obj.choices:
  185. for choice_item in field_obj.choices:
  186. if admin_obj.filter_condtions.get(filter_column) == str(choice_item[0]):
  187. selected = "selected"
  188. select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
  189. selected = ""
  190.  
  191. if type(field_obj).__name__ in "ForeignKey":
  192. for choice_item in field_obj.get_choices()[1:]:
  193. if admin_obj.filter_condtions.get(filter_column)== str(choice_item[0]): # 就是选择的这个条件,整数转字符串
  194. selected = "selected"
  195. select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[0], selected, choice_item[1])
  196. selected=''
  197.  
  198. if type(field_obj).__name__ in ['DateTimeField', 'DateField']: # 如果是时间格式
  199. date_els = [] # 日期条件项
  200. today_ele = datetime.now().date() # 今天日期
  201. date_els.append(['今天', today_ele]) # 今天
  202. date_els.append(['昨天', today_ele - timedelta(days=1)]) # 昨天
  203. date_els.append(['近7天', today_ele - timedelta(days=7)]) # 一周
  204. date_els.append(['近30天', today_ele - timedelta(days=30)]) # 三十
  205. date_els.append(['本月', today_ele.replace(day=1)]) # 本月
  206. date_els.append(['近90天', today_ele - timedelta(days=90)]) # 90天
  207. date_els.append(['近365天', today_ele - timedelta(days=365)]) # 365天
  208. date_els.append(['本年', today_ele.replace(month=1, day=1)]) ##今年
  209.  
  210. for choice_item in date_els:
  211. if admin_obj.filter_condtions.get("%s__gte" %filter_column)==str(choice_item[1]):
  212. selected = 'selected'
  213. select_ele += """<option value="%s" %s>%s</option> """ % (choice_item[1], selected, choice_item[0])
  214. selected = ''
  215. filter_column_name = "%s__gte" %filter_column
  216. else:
  217. filter_column_name = filter_column
  218.  
  219. select_ele += "</select>"
  220. select_ele=select_ele.format(filter_column=filter_column_name)#格式化时间的判断条件
  221. return mark_safe(select_ele)
  222. # ————————16PerfectCRM实现King_admin日期过滤————————
  223.  
  224. # ————————17PerfectCRM实现King_admin单列排序————————
  225. # kingadmin排序功能
  226. @register.simple_tag
  227. def get_orderby_key(request,column):
  228. current_order_by_key = request.GET.get("_o")
  229. # ————————18PerfectCRM实现King_admin搜索关键字————————
  230. search_key = request.GET.get("_q")
  231. if search_key != None:
  232. if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
  233. if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
  234. if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
  235. return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
  236. else:
  237. return "-%s&_q=%s" % (column, search_key)
  238. return "%s&_q=%s" % (column, search_key)
  239. else:
  240. # ————————18PerfectCRM实现King_admin搜索关键字————————
  241. if current_order_by_key != None: #如果不为空 #肯定有某列被排序了
  242. if current_order_by_key == column: # 判断是否相等 #当前这列正在被排序
  243. if column.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
  244. return column.strip("-") #strip去掉 文本中句子开头与结尾的符号的
  245. else:
  246. return "-%s"%column
  247. # else:
  248. # return column
  249. # else:
  250. # return column
  251. return column #同上4句
  252. # kingadmin排序功能
  253.  
  254. # kingadmin排序功能 显示排序图标
  255. # @register.simple_tag
  256. # def display_order_by_icon(request, column):
  257. # current_order_by_key = request.GET.get("_o")
  258. # if current_order_by_key != None: #肯定有某列被排序了
  259. # if current_order_by_key.strip("-") == column: ## 当前这列正在被排序
  260. # if current_order_by_key.startswith("-"):
  261. # icon = "fa-arrow-up"
  262. # else:
  263. # icon = "fa-arrow-down"
  264. # ele = """<i class="fa %s" aria-hidden="true"></i>""" % icon
  265. # return mark_safe(ele)
  266. # return ''
  267. # kingadmin排序功能 显示排序图标
  268. @register.simple_tag
  269. def display_order_by_icon(request, column):
  270. current_order_by_key = request.GET.get("_o")
  271. if current_order_by_key != None: #肯定有某列被排序了
  272. if current_order_by_key.strip("-") == column: # 当前这列正在被排序 #strip去掉 文本中句子开头与结尾的符号的
  273. if current_order_by_key.startswith("-"): #startsWith是String类中的一个方法,用来检测某字符串是否以另一个字符串开始,返回值为boolean类型
  274. icon = "▲"
  275. else:
  276. icon = "▼"
  277. ele = """<i style='color: red'>%s</i>""" % icon
  278. return mark_safe(ele)
  279. return '' #防止出现 None
  280. # kingadmin排序功能 显示排序图标
  281.  
  282. # kingadmin排序功能 # 过滤后排序功能 #}
  283. @register.simple_tag
  284. def get_current_orderby_key(request): #注意生成的URL问题
  285. #获取当前正在排序的字段名 #<input type="hidden" name="_o" value="{% get_current_orderby_key request %}">
  286. current_order_by_key = request.GET.get("_o")
  287. return current_order_by_key or ''
  288. # kingadmin排序功能 # 过滤后排序功能 #}
  289.  
  290. # kingadmin排序功能 # 过滤后排序功能 # 排序分页
  291. @register.simple_tag
  292. def generate_order_by_url (request):
  293. current_order_by_key = request.GET.get("_o")
  294. if current_order_by_key != None: # 肯定有某列被排序了
  295. return "&_o=%s" % current_order_by_key
  296. return ''
  297. # kingadmin排序功能 # 过滤后排序功能 # 排序分页
  298. # ————————17PerfectCRM实现King_admin单列排序————————
  299.  
  300. # ————————18PerfectCRM实现King_admin搜索关键字————————
  301. @register.simple_tag
  302. def get_search_key(request): # 搜索框里保留搜索值
  303. search_key = request.GET.get("_q")
  304. return search_key or ''
  305. # ————————18PerfectCRM实现King_admin搜索关键字————————
  306.  
  307. # ————————23PerfectCRM实现King_admin数据删除————————
  308. # <-------------------获取删除映射关系--------------------------------
  309. @register.simple_tag
  310. def display_all_related_obj(objs):
  311. # 取出对象及所有相关联的数据
  312. from django.db.models.query import QuerySet
  313. if type(objs) != QuerySet:
  314. objs = [objs, ]
  315. if objs:
  316. model_class = objs[0]._meta.model # 取表对象
  317. model_name = objs[0]._meta.model_name # 取表名
  318. return mark_safe(recursive_related_objs_lookup(objs))
  319. # <-----------------递归获取映射关系--------------------------------
  320. def recursive_related_objs_lookup(objs, name=None, conn_batch_size=0):
  321. name = set()
  322. print(name)
  323. print('传递过来的objs:', objs)
  324. # 开始标签的拼接
  325. ul_ele = "<ul style='color: blue'>"
  326. for obj in objs:
  327. li_ele = '''<li>{0}:{1}</li>'''.format(obj._meta.verbose_name, obj.__str__().strip("<>"))
  328. print('str:', obj.__str__(), '类型:', type(obj.__str__()))
  329. print('关联的表的自定表名:', li_ele)
  330. ul_ele += li_ele
  331. print('拼接li_ele:', ul_ele)
  332. # 映射关系处理
  333. # <---------------------------特殊关联处理-----------------------------------
  334. # 多对多关系
  335. for m2m_field in obj._meta.local_many_to_many: # local_many_to_many返回列表,many_to_many返回元祖
  336. print('--开始循环反射-多对多-关系处理--')
  337. sub_ul_ele = "<ul style='color: red'>"
  338. m2m_field_obj = getattr(obj, m2m_field.name) # 反射 如果有选项
  339. print('反射选项:', m2m_field_obj)
  340.  
  341. for m2m_data in m2m_field_obj.select_related():
  342. print('开始循环多对多标签拼接:', m2m_data)
  343.  
  344. sub_li_ele = '''<li>{0}:{1}</li>'''.format(m2m_field.verbose_name, m2m_data.__str__().strip("<>"))
  345. sub_ul_ele += sub_li_ele
  346. sub_ul_ele += '</ul>'
  347. ul_ele += sub_ul_ele
  348. print('生成完整 多对多 标签..:', ul_ele)
  349. # <---------------------------外健关联处理------------------------------------
  350. for related_obj in obj._meta.related_objects:
  351. print('--开始-外健关联-处理--')
  352. if hasattr(obj, related_obj.get_accessor_name()):
  353. print('--判断对象中是否包含反查属性--')
  354. accessor_obj = getattr(obj, related_obj.get_accessor_name())
  355. print('获取反查对应的对象: ')
  356. if hasattr(accessor_obj, 'select_related'):
  357. print('--判断有没有获取数据的方法或属性-- ')
  358. target_object = accessor_obj.select_related()
  359. print('获取数据的方法或属性: ', target_object)
  360.  
  361. if 'ManyToManyRel' in related_obj.__repr__():
  362. print('--开始-外健关联-多对多-处理--.')
  363.  
  364. # 生成UL
  365. sub_ul_ele = '<ul style="color: green">'
  366. for data in target_object:
  367. print('开始循环-外健关联-标签拼接...', data)
  368. sub_li_ele = '''<li>{0}:{1}</li>'''.format(data._meta.verbose_name,
  369. data.__str__().strip("<>"))
  370. sub_ul_ele += sub_li_ele
  371. sub_ul_ele += '</ul>'
  372. ul_ele += sub_ul_ele
  373. print('-外健关联-生成完整标签:', ul_ele)
  374. # <---------------递归处理-------------------
  375. if len(target_object) != conn_batch_size:
  376. print('--有下级对象存在,进行-递归-循环--')
  377. names = target_object.__str__()
  378. print(names, type(names))
  379. if names == name:
  380. print('--如果是自己关联自己,就不递归了--')
  381. ul_ele += '</ul>'
  382. return ul_ele
  383. else:
  384. print('--防止无限递归+1--')
  385. conn_batch_size = conn_batch_size + 1
  386. node = recursive_related_objs_lookup(target_object, name=names,
  387. conn_batch_size=conn_batch_size)
  388. ul_ele += node
  389.  
  390. # <---------------由于使用递归,下面的标签样会发生重复,就不需要使用了--------------------
  391. else:
  392. print('外健关联 一对一:', accessor_obj)
  393. target_object = accessor_obj
  394. print("外健关联 一对一:", target_object, '属性:', type(target_object))
  395.  
  396. ul_ele += '</ul>'
  397. return ul_ele
  398.  
  399. # ————————23PerfectCRM实现King_admin数据删除————————
  400.  
  401. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  402. #自定制 actions功能 显示
  403. @register.simple_tag
  404. def get_admin_actions(admin_obj):
  405. #选择功能
  406. options = "<option class='form-control' value='-1'>-------</option>"#默认为空
  407. actions = admin_obj.default_actions + admin_obj.actions #默认加自定制
  408. print('默认加自定制',actions)
  409. for action in actions:
  410. action_func = getattr(admin_obj,action)#功能方法 #反射
  411. if hasattr(action_func,"short_description"):#反射 如有自定义的名称执行函数方法
  412. action_name = action_func.short_description#等于自定义的名称 #显示中文
  413. else:
  414. action_name = action#等于函数名称
  415. options += """<option value="{action_func_name}">{action_name}</option> """.format(action_func_name=action, action_name=action_name)
  416. return mark_safe(options)
  417. # ————————24PerfectCRM实现King_admin自定义操作数据————————
  418.  
  419. # ————————27PerfectCRM实现King_admin编辑复选框————————
  420. # 复选 框内容待选数据
  421. @register.simple_tag
  422. def get_m2m_available_objs(admin_obj, field_name):
  423. '''返回m2m左侧所有待选数据'''
  424. # c= admin_obj.model.tags.rel.model.objects.all()
  425. # print('c',c)
  426. # m2m_objs= admin_obj.model.tags.rel.model.objects.all()
  427. # print('m2m_objs',m2m_objs)
  428. m2m_model = getattr(admin_obj.model, field_name).rel # 复选框对象
  429. m2m_objs = m2m_model.model.objects.all() # 获取到复选框所有内容
  430. return m2m_objs
  431.  
  432. # 复选 框内容已选中数据
  433. @register.simple_tag
  434. def get_m2m_chosen_objs(admin_obj, field_name, obj):
  435. """
  436. 返回已选中的列表
  437. :param admin_obj:
  438. :param field_name:
  439. :param obj: 数据对象
  440. :return:
  441. """
  442. # print(["--->obj",obj])
  443. if obj.id:
  444. return getattr(obj, field_name).all() # 返回所有的内容
  445. return [] # 没有数据为返回空 创建新的记录使用
  446. # ————————27PerfectCRM实现King_admin编辑复选框————————

#kingadmin_tags.py

Django项目:CRM(客户关系管理系统)--35--27PerfectCRM实现King_admin编辑复选框的更多相关文章

  1. Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  2. Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  3. Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  4. Django项目:CRM(客户关系管理系统)--58--48PerfectCRM实现CRM客户报名流程学生合同

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  5. Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑

    #base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...

  6. Django项目:CRM(客户关系管理系统)--67--57PerfectCRM实现admin批量生成上课记录

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

  7. Django项目:CRM(客户关系管理系统)--65--55PerfectCRM实现CRM客户报名状态颜色变化

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  8. Django项目:CRM(客户关系管理系统)--64--54PerfectCRM实现CRM客户报名链接

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  9. Django项目:CRM(客户关系管理系统)--43--35PerfectCRM实现CRM重写Admin密码修改

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

随机推荐

  1. Lua程序设计之字符串精要

    (摘自Lua程序设计) 基本: Lua语言的字符串是一串字节组成的序列. 在Lua语言中,字符使用8个比特位来存储. Lua语言中的字符串可以存储包括空字符在内的所有数值代码,这意味着我们可以在字符串 ...

  2. Android开发 TextView的开发记录

    前言 此篇博客是记录一些TextView开发上一些少用的开发功能项.目前开发记录如下: 添加图片 文字滚动 添加省略号 实现长文的收起和展开功能 改变一个字符串里自定字符的颜色或者大小 效果字体(粗体 ...

  3. [转]C#多线程学习 之 线程池[ThreadPool]

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  4. 使用log4j实现日志API

    添加SLF4J依赖,用于提供日志API, 使用log4j作为实现 1.pom.xml添加SLF4J依赖 <!-- SLF4J --> <dependency> <grou ...

  5. Apache Flink 进阶入门(二):Time 深度解析

    前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction.中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层 ...

  6. 漫说安全|智能的云WAF,开挂的Web防御

    “漫说安全”是我们推出的一个新栏目,以简洁明了的形式展现高深晦涩的云安全. 今天我们要讲的是智能的云WAF到底有啥“本领”,答案就在漫画里^_^ 漫画看完后估计你还会有些小疑问,不要着急,安全君特意准 ...

  7. 集合划分——cf1028D思维题

    非常思维的一道题目,题意很长 给定s1,s2两个集合,s1维护最大值,s2维护最小值,s1的所有元素要比s2小 操作1:往两个集合里的任意一个添加x 操作2:把x从所在的集合里删掉:要求被删的x必须是 ...

  8. 菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t[转]

    菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...

  9. momentjs 使用总结

    一.安装 cnpm install moment 二.引入 var moment = require('moment') 三.使用 let today = moment().format('YYYY- ...

  10. pycharm优化

    一.版本选择 建议安装5.0版本,因为好注册,这个你懂得. 下载地址: https://confluence.jetbrains.com/display/PYH/Previous+PyCharm+Re ...