# king_urls.py
# ————————02PerfectCRM创建ADMIN页面————————
from django.conf.urls import url
from king_admin import views urlpatterns = [
url(r'^$', views.app_index),#主页 # ————————21PerfectCRM实现King_admin查看页面美化————————
url(r'^(\w+)/$', views.table_index, name='table_index'), # 单个具体app页面
# ————————21PerfectCRM实现King_admin查看页面美化———————— # ————————08PerfectCRM实现King_admin显示注册表的字段表头————————
url(r'^(\w+)/(\w+)/$', views.table_data_list,name='table_data_list'),#详细内容
# ————————08PerfectCRM实现King_admin显示注册表的字段表头———————— # ————————19PerfectCRM实现King_admin数据修改————————
url(r'^(\w+)/(\w+)/(\d+)/change/$', views.table_change,name='table_change'),#修改信息
# ————————19PerfectCRM实现King_admin数据修改———————— # ————————36PerfectCRM实现King_admin密码修改————————
url(r'^(\w+)/(\w+)/(\d+)/password/$', views.password_reset, name="password_reset"), # 修改密码
# ————————36PerfectCRM实现King_admin密码修改———————— # ————————22PerfectCRM实现King_admin数据添加————————
url(r'^(\w+)/(\w+)/add/$', views.table_add,name='table_add'), #添加信息
# ————————22PerfectCRM实现King_admin数据添加———————— # ————————23PerfectCRM实现King_admin数据删除————————
url(r'^(\w+)/(\w+)/(\d+)/delete/$', views.table_delete, name="table_delete"), # 删除信息
# ————————23PerfectCRM实现King_admin数据删除————————
]
# ————————02PerfectCRM创建ADMIN页面————————

# king_urls.py

 #views

 # ————————02PerfectCRM创建ADMIN页面————————
from django.shortcuts import render # ————————04PerfectCRM实现King_admin注册功能————————
# from django import conf #配置文件
# print("dj conf:",conf) #配置文件
# print("dj conf:",conf.settings)#配置文件.设置
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
from king_admin import app_config #自动调用 动态加载类和函数
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
# from king_admin.base_admin import registered_sites # registered_sites={}
from king_admin import base_admin
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————11PerfectCRM实现King_admin基本分页————————
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # 分页功能
# ————————11PerfectCRM实现King_admin基本分页———————— def app_index(request):
# ————————04PerfectCRM实现King_admin注册功能————————
# for app in conf.settings.INSTALLED_APPS:
# print(app)#循环打印 配置文件.设置.安装应用程序#.Perfectcustomer\settings里的INSTALLED_APPS列表
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
# return render(request, 'king_admin/app_index.html')
# print("registered_sites",registered_sites)
# return render(request, 'king_admin/app_index.html')
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————04PerfectCRM实现King_admin注册功能————————
# print("registered_sites", base_admin.registered_sites)
# return render(request, 'king_admin/app_index.html')
# ————————04PerfectCRM实现King_admin注册功能———————— # ————————05PerfectCRM实现King_admin注册功能获取内存————————
print("registered_sites",base_admin.site.registered_sites)
return render(request, 'king_admin/app_index.html', {"site": base_admin.site})
# ————————05PerfectCRM实现King_admin注册功能获取内存———————— # ————————02PerfectCRM创建ADMIN页面———————— # ————————13PerfectCRM实现King_admin分页页数————————
#处理def table_data_list(request,app_name,model_name):里的内容,
def filter_querysets(request,queryset):
condtions = {} #定义一个字典用来存过滤的条件
for k,v in request.GET.items():#不需要空的,判断是否为空
# ————————18PerfectCRM实现King_admin搜索关键字————————
# ————————17PerfectCRM实现King_admin单列排序————————
# if k=="page":continue##kingadmin分页功能 # if k=="page":continue##kingadmin分页功能 #写法一
# elif k=="_o":continue##kingadmin排序功能 <a href="?_o={{ column }}">{{ column }}</a> # if k in ("page","_o") :continue #kingadmin分页功能 #kingadmin排序功能 #写法二 # if k == "page"or k == "_o": #保留的分页关键字 和 排序关键字 #写法三
# continue #continue是结束单次循环
# ————————17PerfectCRM实现King_admin单列排序————————
if k in ("page", "_o", "_q"): continue # kingadmin分页,排序,搜索#判断标签是否存在 自定义的名称
# ————————18PerfectCRM实现King_admin搜索关键字———————— # ————————15PerfectCRM实现King_admin多条件过滤————————
if v:
condtions[k] = v #进行配对字典
# ————————15PerfectCRM实现King_admin多条件过滤————————
query_res = queryset.filter(**condtions) return query_res,condtions
# ————————13PerfectCRM实现King_admin分页页数———————— # ————————08PerfectCRM实现King_admin显示注册表的字段表头————————
def table_data_list(request,app_name,model_name):
#通过2个参数到base_admin里获取class AdminRegisterException(Exception): 的对象
admin_obj = base_admin.site.registered_sites[app_name][model_name] #base_admin # ————————24PerfectCRM实现King_admin自定义操作数据————————
if request.method == "POST":#批量操作
action = request.POST.get("action_select")#要调用的自定制功能函数
selected_ids = request.POST.get("selected_ids")#前端提交的数据
print(selected_ids,type(selected_ids),"selected_ids-----")
#if type(selected_ids)!='str':
#selected_ids = json.loads(selected_ids)#进行转换数据
print(selected_ids,type(action),action,"selected_ids==========")
#print("action:",selected_ids,action)
if selected_ids :
#selected_ids = json.loads(selected_ids)#进行转换数据
selected_objs = admin_obj.model.objects.filter(id__in=selected_ids.split(','))#返回之前所选中的条件
else:
raise KeyError('错误,没有选择对象!') if hasattr(admin_obj,action):
action_func = getattr(admin_obj,action)#如果admin_obj 对象中有属性action 则打印self.action的值,否则打印'not find'
request._admin_action=action#添加action内容
print(request._admin_action,action,'<--------')
return action_func(request,selected_objs)
# ————————24PerfectCRM实现King_admin自定义操作数据———————— # ————————09PerfectCRM实现King_admin显示注册表的内容————————
admin_obj.querysets = admin_obj.model.objects.all()#取数据 传到 前端
# ————————09PerfectCRM实现King_admin显示注册表的内容———————— # ————————11PerfectCRM实现King_admin分页显示条数————————
# from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # 分页功能#放在顶上导入
obj_list = admin_obj.model.objects.all()#取数据 传到 前端 #base_admin #获取传过来的所有对象 # ————————13PerfectCRM实现King_admin分页页数————————
queryset, condtions = filter_querysets(request, obj_list) #base_admin # 调用条件过滤
# ————————13PerfectCRM实现King_admin分页页数———————— # ————————18PerfectCRM实现King_admin搜索关键字————————
queryset = get_queryset_search_result(request,queryset,admin_obj)##搜索后
# ————————18PerfectCRM实现King_admin搜索关键字———————— # ————————26PerfectCRM实现King_admin自定义排序————————
sorted_queryset = get_orderby(request, queryset,admin_obj) #排序后的结果
# ————————17PerfectCRM实现King_admin单列排序————————
# sorted_queryset = get_orderby(request, queryset) #排序后的结果
# ————————15PerfectCRM实现King_admin多条件过滤————————
# paginator = Paginator(obj_list,admin_obj.list_per_page) #kingadmin里class CustomerAdmin(BaseAdmin):
# paginator = Paginator(queryset, admin_obj.list_per_page)
# ————————15PerfectCRM实现King_admin多条件过滤————————
paginator = Paginator(sorted_queryset, admin_obj.list_per_page)
# ————————17PerfectCRM实现King_admin单列排序————————
# ————————26PerfectCRM实现King_admin自定义排序———————— page = request.GET.get('page')
try:
objs = paginator.page(page) # 当前的页面的数据
except PageNotAnInteger:
# 如果页面不是一个整数,交付第一页。
objs = paginator.page(1)
except EmptyPage:
# 如果页面的范围(例如9999),交付最后一页的搜索结果。
objs = paginator.page(paginator.num_pages)
admin_obj.querysets = objs # base_admin # ————————13PerfectCRM实现King_admin分页页数————————
admin_obj.filter_condtions = condtions # base_admin
# ————————13PerfectCRM实现King_admin分页页数———————— # ————————11PerfectCRM实现King_admin分页显示条数———————— return render(request,"king_admin/table_data_list.html",locals())
# ————————08PerfectCRM实现King_admin显示注册表的字段表头———————— # ————————17PerfectCRM实现King_admin单列排序————————
# def get_orderby(request,queryset):
# order_by_key = request.GET.get("_o") #获取URL里有没有("_o") <a href="?_o={{ column }}">{{ column }}</a>
# #页面刚开始没有这个值
# if order_by_key != None: #有("_o")这个值 就进行排序
# query_res = queryset.order_by(order_by_key)
# else: #没有就不排序,直接返回
# query_res = queryset
# return query_res #排序时会错 # orderby_key = request.GET.get("_o")
# if orderby_key:
# return queryset.order_by(orderby_key)
# return queryset #在table_data_list添加
# def table_data_list(request,app_name,model_name): #详细列表
# sorted_queryset = get_orderby(request, queryset)
#在filter_querysets添加
#if k == "page"or k == "_o": #保留的分页关键字 和 排序关键字
# ————————17PerfectCRM实现King_admin单列排序———————— # ————————26PerfectCRM实现King_admin自定义排序————————
def get_orderby(request, queryset, admin_obj):
orderby_key = request.GET.get("_o")
#order_by_key1=order_by_key.strip()
if orderby_key: #有获取到字段
query_res = queryset.order_by(orderby_key.strip()) #.strip()默认删除空白符(包括'\n', '\r', '\t', ' ')
else:
if admin_obj.ordering: #查看kingadmin‘有没有 ordering = '-qq' # 自定义排序
query_res = queryset.order_by("%s" %admin_obj.ordering)
else:
query_res = queryset.order_by('-id') #默认倒序
return query_res #在table_data_list添加
# def table_data_list(request,app_name,model_name): #详细列表
# sorted_queryset = get_orderby(request, queryset, admin_obj) # 排序后的结果
# ————————26PerfectCRM实现King_admin自定义排序———————— # ————————18PerfectCRM实现King_admin搜索关键字————————
from django.db.models import Q
def get_queryset_search_result(request,queryset,admin_obj):
search_key = request.GET.get("_q", "")#取定义名,默认为空
q_obj = Q()#多条件搜索 #from django.db.models import Q
q_obj.connector = "OR" # or/或 条件
for column in admin_obj.search_fields: #搜索目标crm/kingadmin里class CustomerAdmin(BaseAdmin):search_fields = ('name','qq',)
q_obj.children.append(("%s__contains" % column, search_key)) #运态添加多个条件
res = queryset.filter(q_obj) #对数据库进行条件搜索
return res #返回结果
#在table_data_list添加
#def table_data_list(request,app_name,model_name): #详细列表
# queryset = get_queryset_search_result(request,queryset,admin_obj)
# ————————18PerfectCRM实现King_admin搜索关键字———————— # ————————19PerfectCRM实现King_admin数据修改————————
from king_admin import forms
#修改内容
# def table_change(request,app_name,model_name):
# obj_form = forms.CustomerModelForm() #创建一个空表单
# return render(request,"kingadmin/table_change.html",locals()) def table_change(request,app_name,model_name,obj_id):
admin_obj = base_admin.site.registered_sites[app_name][model_name] #获取表对象
#kingadmin/forms.py里def CreateModelForm(request,admin_obj):
model_form = forms.CreateModelForm(request,admin_obj=admin_obj) ##modelform 生成表单 加验证
# obj_form = model_form() # 表单
obj = admin_obj.model.objects.get(id=obj_id)#根据ID获取数据记录 # ————————28PerfectCRM实现King_admin编辑限制————————
# ————————20PerfectCRM实现King_admin数据修改美化————————
# #面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
# obj_form = model_form(instance=obj) # 数据传入表单 if request.method == "GET":#如果是 GET 表示 是添加记录
obj_form = model_form(instance=obj)#数据传入表单
elif request.method == "POST":#如果是 POST 表示 是修改后的数据
obj_form = model_form(instance=obj,data=request.POST)#更新数据
if obj_form.is_valid():
obj_form.save()
# ————————20PerfectCRM实现King_admin数据修改美化————————
# ————————28PerfectCRM实现King_admin编辑限制———————— return render(request,"king_admin/table_change.html",locals())
# ————————19PerfectCRM实现King_admin数据修改———————— # ————————21PerfectCRM实现King_admin查看页面美化————————
#单个具体app页面
def table_index(request,app_name):
bases=base_admin.site.registered_sites[app_name]#取出对应app对象
return render(request, 'king_admin/table_index.html', {"site":bases,'app_name':app_name})
# ————————21PerfectCRM实现King_admin查看页面美化———————— # ————————22PerfectCRM实现King_admin数据添加————————
from django.shortcuts import redirect # kingadmin添加内容
def table_add(request,app_name,model_name):
admin_obj = base_admin.site.registered_sites[app_name][model_name] #获取表对象 # ————————32PerfectCRM实现King_admin添加不进行限制————————
admin_obj.is_add_form=True#表示为新增表单
# ————————32PerfectCRM实现King_admin添加不进行限制———————— model_form = forms.CreateModelForm(request,admin_obj=admin_obj) ##modelform 生成表单 加验证 if request.method == "GET":
obj_form = model_form() #跳转过来的为空 elif request.method == "POST":
obj_form = model_form(data=request.POST) #创建数据
if obj_form.is_valid():
# ————————32PerfectCRM实现King_admin添加不进行限制————————
# obj_form.save()
try:
obj_form.save()#表单验证通过保存
except Exception as e:
return redirect("/king_admin/%s/%s/" % (app_name,model_name))#转到之前的页面
# ————————32PerfectCRM实现King_admin添加不进行限制————————
if not obj_form.errors: #没有错误返回原来的页面
#from django.shortcuts import redirect
return redirect("/king_admin/%s/%s/" % (app_name,model_name))
return render(request, "king_admin/table_add.html", locals()) # ————————22PerfectCRM实现King_admin数据添加———————— # ————————23PerfectCRM实现King_admin数据删除————————
def table_delete(request,app_name,model_name,obj_id):
admin_obj = base_admin.site.registered_sites[app_name][model_name]#表类
objs=admin_obj.model.objects.filter(id=obj_id)#类的对象 # ————————33PerfectCRM实现King_admin编辑整张表限制————————
# if request.method=='POST':
# objs.delete()#删除
# return redirect("/king_admin/%s/%s/" % (app_name,model_name))#转到列表页面 app_name=app_name
if admin_obj.readonly_table:
errors={'锁定的表单':'该表单:<%s>,已经锁定,不能删除当前记录!'%model_name}
else:
errors={}
if request.method=='POST':
if not admin_obj.readonly_table:
objs.delete()#删除
return redirect("/king_admin/%s/%s/" % (app_name,model_name))#转到列表页面
# ————————33PerfectCRM实现King_admin编辑整张表限制———————— return render(request, "king_admin/table_delete.html", locals())#locals 返回一个包含当前范围的局部变量字典。
# ————————23PerfectCRM实现King_admin数据删除———————— # ————————36PerfectCRM实现King_admin密码修改————————
#密码修改
def password_reset(request,app_name,model_name,obj_id):
admin_obj = base_admin.site.registered_sites[app_name][model_name]#表类
model_form = forms.CreateModelForm(request,admin_obj=admin_obj)#modelform 生成表单 加验证
obj=admin_obj.model.objects.get(id=obj_id)#类表的对象
errors={}#错误提示
if request.method=='POST':
_password1=request.POST.get('password1') #获取页面输入的值
_password2=request.POST.get('password2') #获取页面输入的值
if _password1==_password2:
if len(_password1)>5:
obj.set_password(_password1)#继承Django方法 #加密
obj.save() #保存
return redirect(request.path.rstrip('password/') + ('/change/')) #替换URL名
else:
errors['password_too_short']='必须不少于6字符'
else:
errors['invalid_password']='两次输入的密码不一样'#密码不一致 return render(request, "king_admin/password_reset.html", locals())#locals 返回一个包含当前范围的局部变量字典。
# ————————36PerfectCRM实现King_admin密码修改————————

#views

 {#password_reset.html#}
{## ————————36PerfectCRM实现King_admin密码修改————————#}
{% extends "king_master/king_index.html" %}
{% load kingadmin_tags %}
{% 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>
<li><a href="/king_admin/{% get_app_name admin_obj.model %}/{% get_model_name admin_obj.model %}/{{ obj_id }}/change/">{{ obj }} </a></li>
<li class="active">重置密码</li>
</ol>
{% block Tops %}
<div class="panel panel-info">
<div class="panel-heading">
<h4 class="panel-title">重置用户|{{ obj }} 密码</h4>
</div>
</div>
{% endblock %}
</div> <div class="row">
<div class="panel panel-info panel-body">
<form class="form-horizontal" method="post" >{% csrf_token %}
<span style="color: red">{{ model_form.errors }}</span>
<div class="form-group">
<label class="col-sm-2 " style="font-weight: normal"> 用户名:</label>
<div class="col-md-5">
<input type="text" name="user" class="form-control" value="{{ obj }}" disabled>
</div>
</div> <div class="form-group">
<label class="col-sm-2 " style="font-weight: normal">密码:</label>
<div class="col-md-5">
<input type="password" name="password1" class="form-control">
</div>
</div> <div class="form-group">
<label class="col-sm-2 " style="font-weight: normal"> 密码(重复): </label>
<div class="col-md-5">
<input type="password" name="password2" class="form-control">
</div>
{% for k, v in errors.items %}
<span style="color: red">{{ v }}</span>
{% endfor %}
</div> <input type="submit" value="提交" class="pull-right btn btn-info">
</form>
</div>
</div>
{% endblock %}
{## ————————36PerfectCRM实现King_admin密码修改————————#}

{#password_reset.html#}

 # 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自定义操作数据———————— # ————————28PerfectCRM实现King_admin编辑限制————————
from django.forms import ValidationError
from django.shortcuts import render,redirect
# ————————28PerfectCRM实现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编辑复选框———————— # ————————33PerfectCRM实现King_admin编辑整张表限制————————
readonly_table=True#默认表单不锁定
# ————————33PerfectCRM实现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自定义操作数据———————— # ————————28PerfectCRM实现King_admin编辑限制————————
# ————————31PerfectCRM实现King_admin编辑多对多限制————————
# readonly_fields = ('qq', 'consultant',) # 不可修改
readonly_fields = ('qq', 'consultant','tags',) # 不可修改
# ————————31PerfectCRM实现King_admin编辑多对多限制———————— # ————————29PerfectCRM实现King_admin编辑自定义限制————————
def default_form_validation(self,obj):
print('validation:制定的',obj.cleaned_data)
consult_course=obj.cleaned_data.get('content','')#自制验证字段
if len(consult_course)<10:
return ValidationError(#添加错误信息 返回
("该字段%(field)s 咨询内容记录不能少于10个字符"),
code='invalid',
params={'field':'content',},
)
# ————————29PerfectCRM实现King_admin编辑自定义限制———————— # ————————28PerfectCRM实现King_admin编辑限制———————— # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
def clean_name(self,obj,*args,**kwargs):#名称验证 单个
name=obj.cleaned_data['name']
if not name:
obj.add_error('name','不能为空!')
return ValidationError(#添加错误信息 返回
("%(field)s:该字段 不能为空"),
code='invalid',
params={'field':'name',},
)
elif len(name)<5:
obj.add_error('name','不能小于5个字符!')
#return ValidationError('',)
return ValidationError(#添加错误信息 返回
("%(field)s:该字段 不能小于5个字符!"),
code='invalid',
params={'field':'name',},
)
# ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— # ————————34PerfectCRM实现CRM自定义用户————————
#10账号表
class UserProfileAdmin(BaseAdmin):#定制Djanago admin
list_display = ('id', 'email', 'name') # 显示字段表头 # ————————36PerfectCRM实现King_admin密码修改————————
readonly_fields = ('password',) # 不可修改,限制
filter_horizontal = ('user_permissions','groups') #复选框
modelform_exclude_fields=['last_login']#排除#不显示 #自增日期 #base_admin.py #forms.py
# ————————36PerfectCRM实现King_admin密码修改———————— site.register(models.UserProfile, UserProfileAdmin)
# ————————34PerfectCRM实现CRM自定义用户———————— # ————————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编辑复选框———————— # ————————33PerfectCRM实现King_admin编辑整张表限制————————
readonly_table=False#默认表单不锁定
# ————————33PerfectCRM实现King_admin编辑整张表限制———————— # ————————36PerfectCRM实现King_admin密码修改————————
modelform_exclude_fields=[]#排除验证字段
# ————————36PerfectCRM实现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') # ————————33PerfectCRM实现King_admin编辑整张表限制————————
if self.readonly_table:
errors={'锁定的表单':'当前表单已经锁定,不可进行批量删除操作!'}
else:
errors={}
# ————————33PerfectCRM实现King_admin编辑整张表限制———————— if request.POST.get('delete_confirm')=='yes': #{#table_delete.html#} # ————————33PerfectCRM实现King_admin编辑整张表限制————————
if not self.readonly_table:
# ————————33PerfectCRM实现King_admin编辑整张表限制————————
queryset.delete()
return redirect('/king_admin/%s/%s/'%(app_name,model_name))
else:
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自定义操作数据———————— # ————————28PerfectCRM实现King_admin编辑限制————————
readonly_fields = [] # 不可修改 # ————————29PerfectCRM实现King_admin编辑自定义限制————————
#默认表单验证 全部 可重写
def default_form_validation(self,request):
#用户可以在此进行自定义的表单验证,相当于django form 的clean方法
'''默认表单验证 == django form 的clean方法'''
pass
# ————————29PerfectCRM实现King_admin编辑自定义限制————————
# ————————28PerfectCRM实现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

 # forms.py
# ————————19PerfectCRM实现King_admin数据修改————————
from django import forms
from crm import models # class CustomerModelForm(forms.ModelForm):
# class Meta: #调用内置方法
# model = models.Customer #获取表名
# fields = "__all__" #字段 # ————————32PerfectCRM实现King_admin添加不进行限制————————
def CreateModelForm(request,admin_obj): # 添加不进行限制到views里处理
# ————————32PerfectCRM实现King_admin添加不进行限制———————— class Meta: #调用内置方法
model = admin_obj.model #获取表名
fields = "__all__" #字段 # ————————36PerfectCRM实现King_admin密码修改————————
exclude= admin_obj.modelform_exclude_fields#排除不需要验证的字段
# ————————36PerfectCRM实现King_admin密码修改———————— # ————————20PerfectCRM实现King_admin数据修改美化————————
# type()就是一个最实用又简单的查看数据类型的方法。type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查询的对像类型信息。
# dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta}) #生成modelform的类,
# new()方法是在类准备将自身实例化时调用。new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
def __new__(cls, *args, **kwargs):#重写 函数生成方法
# print("base fields",cls.base_fields)
# 字段名 #字段数据
for field_name, field_obj in cls.base_fields.items():
# print(field_name,dir(field_obj))
field_obj.widget.attrs['class'] = 'form-control' # 前端的样式
# field_obj.widget.attrs['maxlength'] = getattr(field_obj,'max_length' ) if hasattr(field_obj,'max_length') \
# else "" # ————————32PerfectCRM实现King_admin添加不进行限制————————
if not hasattr(admin_obj, "is_add_form"): # 如果不是为新增表单
# ————————28PerfectCRM实现King_admin编辑限制————————
if field_name in admin_obj.readonly_fields:#如果,在
field_obj.widget.attrs['disabled'] = True
# ————————28PerfectCRM实现King_admin编辑限制————————
# ————————32PerfectCRM实现King_admin添加不进行限制———————— return forms.ModelForm.__new__(cls) # ————————28PerfectCRM实现King_admin编辑限制————————
def default_clean(self):
#给所有的form默认加一个 clean 验证 # ————————29PerfectCRM实现King_admin编辑自定义限制————————
from django.forms import ValidationError
error_list = []
# ————————29PerfectCRM实现King_admin编辑自定义限制———————— # ————————33PerfectCRM实现King_admin编辑整张表限制————————
from django.utils.translation import ugettext as _ # 国际化
if admin_obj.readonly_table: #在这后端验证,防止黑客添加
raise ValidationError(#添加错误信息
_("该表单不可修改!"),
code='invalid',
)
# ————————33PerfectCRM实现King_admin编辑整张表限制———————— # ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— # ————————32PerfectCRM实现King_admin添加不进行限制————————
if self.instance.id: # 表示为修改表单
# ————————32PerfectCRM实现King_admin添加不进行限制———————— for field in admin_obj.readonly_fields: # 如果是不可修改的字段
# print("readonly",field,self.instance)
# field_val_from_db = getattr(self.instance,field)#取数据库中的值
field_val_from_db = getattr(self.instance, field) # 取数据库中的值
field_val = self.cleaned_data.get(field) # 前端传来的值 # ————————31PerfectCRM实现King_admin编辑多对多限制————————
if hasattr(field_val_from_db,'select_related'):#多对多
m2m_objs=getattr(field_val_from_db,'select_related')().select_related()#调用多对多,获取对应的值
m2m_vals=[i[0] for i in m2m_objs.values_list('id')]#转为列表
set_m2m_vals=set(m2m_vals)#转集合 交集 数据库 # vals_from_frontend=self.cleaned_data.get(field)#前端的值 交集
# m2m_vals=[i[0] for i in vals_from_frontend.values_list('id')]#转为列表
# print(vals_from_frontend,'前端的值 交集',m2m_vals) set_m2m_vals_from_frontend=set([i.id for i in self.cleaned_data.get(field)])#前端的值 交集
from django.utils.translation import ugettext as _ # 国际化
if set_m2m_vals != set_m2m_vals_from_frontend:
error_list.append(ValidationError(
_("%(field)s: 该字段不可修改!"),
code='invalid',
params={'field':field,}
))
self.add_error(field,"不可修改!")
continue #field_val = self.cleaned_data.get(field)#前端传来的值
#print('field_val',type(field_val))
if field_val_from_db != field_val:
print("field not change ")#不一致
error_list.append(ValidationError(#添加错误信息
_("该字段%(field)s 不可修改,原值为: %(val)s"),
code='invalid',
params={'field':field,'val':field_val_from_db}
)) # else: # 被篡改了
# self.add_error(field,' "%s" is a readonly field ,value should be "%s" '% (field, field_val_from_db)) # ————————31PerfectCRM实现King_admin编辑多对多限制———————— #print("cleaned data:",self.cleaned_data,)#要验证的表单
for field in self.cleaned_data:#单独字段
if hasattr(admin_obj,'clean_%s'%field):#是否有该字段的单独验证
field_clean_func=getattr(admin_obj,'clean_%s'%field)#获取对应的函数
response=field_clean_func(self)#
if response:
error_list.append(response)
if error_list:
raise ValidationError(error_list)
#response_sol=admin_obj.('clean_%s'%field)(self.cleaned_data)
# ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— # ————————31PerfectCRM实现King_admin编辑多对多限制————————
# print("default clean:",self)#得到整个form数据
# for field in admin_obj.readonly_fields:#循环获取crm/kingadmin.py里 readonly_fields = ('name','qq',)的数据
# print("readonly",field,self.instance)#获取到 字段名 ,对象(值)
# field_val_from_db = getattr(self.instance,field)#获取数据库的值
# print("cleaned data:", self.cleaned_data)#获取到 前端的值
# field_val = self.cleaned_data.get(field)#获取到 前端的值
#
# if field_val_from_db == field_val:#数据库的值和前端的值对比
# print("数据库数据和前端数据一样 ")
# else: # 被篡改了
# self.add_error(field,' "%s" 是一个只读的字段,值应该是 "%s"! 大神请不要篡改!!!'% (field, field_val_from_db))
# ————————31PerfectCRM实现King_admin编辑多对多限制———————— # ————————29PerfectCRM实现King_admin编辑自定义限制————————
response=admin_obj.default_form_validation(self)#可自定制
if response:
error_list.append(response)
if error_list:
raise ValidationError(error_list)
# ————————29PerfectCRM实现King_admin编辑自定义限制———————— # ————————28PerfectCRM实现King_admin编辑限制———————— dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta}) # 生成modelform的类,
setattr(dynamic_model_form, "__new__", __new__)
# ————————20PerfectCRM实现King_admin数据修改美化———————— # ————————28PerfectCRM实现King_admin编辑限制————————
setattr(dynamic_model_form,"clean",default_clean) #给所有的form默认加一个 clean 验证
# ————————28PerfectCRM实现King_admin编辑限制————— return dynamic_model_form
# ————————19PerfectCRM实现King_admin数据修改————————

# forms.py

Django项目:CRM(客户关系管理系统)--44--36PerfectCRM实现King_admin密码修改的更多相关文章

  1. Django项目:CRM(客户关系管理系统)--50--41PerfectCRM实现全局账号密码修改

    # gbacc_urls.py # ————————38PerfectCRM实现全局账号登录注销———————— from django.conf.urls import url from gbacc ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  9. Django项目:CRM(客户关系管理系统)--68--58PerfectCRM实现king_admin批量生成上课记录

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

  10. Django项目:CRM(客户关系管理系统)--66--56PerfectCRM实现CRM客户报名缴费链接

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

随机推荐

  1. AngularJs 报错 Error: [$parse:lexerr]

    参考:https://www.cnblogs.com/fangshidaima/p/6048071.html 错误: 根据错误找到报错行: $scope.$apply($scope.param1 = ...

  2. CoreML 简单使用

    今天简单使用了下CoreML , 我的这个模型功能主要是 打开摄像头,然后对准物体,会自动帮我们识别摄像头中的物体,并且给我们大概的百分比值 代码如下: @IBAction func startCli ...

  3. php实现在不同国家显示网站的不同语言版本

    首先,你的网站本身要拥有多个语言版本.不然的话你就只能用JS去转化了. 1.通过ip去定位,这个要引用到第三方的接口进行数据的完整返回,但是不知道是我的网速太慢还是什么原因,个人觉得这个方法会卡顿: ...

  4. 【案例】DIV随鼠标移动而移动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. [笔记]180612 for DevOps

    adb devices 识别不了安卓手机:我下的adb interface驱动下载链接:如果设备管理器中ADB Interface是黄色的,就需要先安装adb interface驱动(BD:adb i ...

  6. HTML - 表格标签相关

    <html> <head></head> <body> <!-- table (表格) border : 表格的边框 width : 表格的宽 h ...

  7. 学习笔记 css样式

    大小 width:宽度  height:高度 背景 background-color  背景色   background-image  背景图片     background-repeat  背景平铺 ...

  8. 「题解」:07.18NOIP模拟赛T1:星际旅行

    问题 A: 星际旅行 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 考试心路历程 拿到这道题感觉很懵逼,所以先搞的T2和T3,最后码了个暴力,结果还不如直接输出‘0’得分高 ...

  9. 前端-form表单与CSS

    目录 form表单 表单属性 label标签 input标签 select 下拉框标签 textarea多行文本 提交 Flask 结合form表单 初探 CSS介绍以及基本选择器 基本选择器 组合选 ...

  10. Django之深入了解视图层

    目录 视图层三板斧 HttpResponse render redirect JsonResponse FBV CBV CBV源码 如何给FBV和CBV加装饰器 视图层三板斧 规定视图函数必须有一个返 ...