1 #views
2
3 # ————————02PerfectCRM创建ADMIN页面————————
4 from django.shortcuts import render
5
6 # ————————04PerfectCRM实现King_admin注册功能————————
7 # from django import conf #配置文件
8 # print("dj conf:",conf) #配置文件
9 # print("dj conf:",conf.settings)#配置文件.设置
10 # ————————04PerfectCRM实现King_admin注册功能————————
11
12 # ————————04PerfectCRM实现King_admin注册功能————————
13 from king_admin import app_config #自动调用 动态加载类和函数
14 # ————————04PerfectCRM实现King_admin注册功能————————
15
16 # ————————04PerfectCRM实现King_admin注册功能————————
17 # from king_admin.base_admin import registered_sites # registered_sites={}
18 from king_admin import base_admin
19 # ————————04PerfectCRM实现King_admin注册功能————————
20
21 # ————————11PerfectCRM实现King_admin基本分页————————
22 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # 分页功能
23 # ————————11PerfectCRM实现King_admin基本分页————————
24
25 # ————————46PerfectCRM实现登陆后页面才能访问————————
26 from django.contrib.auth.decorators import login_required
27 # ————————46PerfectCRM实现登陆后页面才能访问————————
28
29 def app_index(request):
30 # ————————04PerfectCRM实现King_admin注册功能————————
31 # for app in conf.settings.INSTALLED_APPS:
32 # print(app)#循环打印 配置文件.设置.安装应用程序#.Perfectcustomer\settings里的INSTALLED_APPS列表
33 # ————————04PerfectCRM实现King_admin注册功能————————
34
35 # ————————04PerfectCRM实现King_admin注册功能————————
36 # return render(request, 'king_admin/app_index.html')
37 # print("registered_sites",registered_sites)
38 # return render(request, 'king_admin/app_index.html')
39 # ————————04PerfectCRM实现King_admin注册功能————————
40
41 # ————————04PerfectCRM实现King_admin注册功能————————
42 # print("registered_sites", base_admin.registered_sites)
43 # return render(request, 'king_admin/app_index.html')
44 # ————————04PerfectCRM实现King_admin注册功能————————
45
46 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
47 print("registered_sites",base_admin.site.registered_sites)
48 return render(request, 'king_admin/app_index.html', {"site": base_admin.site})
49 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
50
51 # ————————02PerfectCRM创建ADMIN页面————————
52
53 # ————————13PerfectCRM实现King_admin分页页数————————
54 #处理def table_data_list(request,app_name,model_name):里的内容,
55 def filter_querysets(request,queryset):
56 condtions = {} #定义一个字典用来存过滤的条件
57 for k,v in request.GET.items():#不需要空的,判断是否为空
58 # ————————18PerfectCRM实现King_admin搜索关键字————————
59 # ————————17PerfectCRM实现King_admin单列排序————————
60 # if k=="page":continue##kingadmin分页功能
61
62 # if k=="page":continue##kingadmin分页功能 #写法一
63 # elif k=="_o":continue##kingadmin排序功能 <a href="?_o={{ column }}">{{ column }}</a>
64
65 # if k in ("page","_o") :continue #kingadmin分页功能 #kingadmin排序功能 #写法二
66
67 # if k == "page"or k == "_o": #保留的分页关键字 和 排序关键字 #写法三
68 # continue #continue是结束单次循环
69 # ————————17PerfectCRM实现King_admin单列排序————————
70 if k in ("page", "_o", "_q"): continue # kingadmin分页,排序,搜索#判断标签是否存在 自定义的名称
71 # ————————18PerfectCRM实现King_admin搜索关键字————————
72
73
74 # ————————15PerfectCRM实现King_admin多条件过滤————————
75 if v:
76 condtions[k] = v #进行配对字典
77 # ————————15PerfectCRM实现King_admin多条件过滤————————
78 query_res = queryset.filter(**condtions)
79
80 return query_res,condtions
81 # ————————13PerfectCRM实现King_admin分页页数————————
82
83
84
85 # ————————08PerfectCRM实现King_admin显示注册表的字段表头————————
86 @login_required # 登陆后页面才能访问
87 def table_data_list(request,app_name,model_name):
88 #通过2个参数到base_admin里获取class AdminRegisterException(Exception): 的对象
89 admin_obj = base_admin.site.registered_sites[app_name][model_name] #base_admin
90
91 # ————————24PerfectCRM实现King_admin自定义操作数据————————
92 if request.method == "POST":#批量操作
93 action = request.POST.get("action_select")#要调用的自定制功能函数
94 selected_ids = request.POST.get("selected_ids")#前端提交的数据
95 print(selected_ids,type(selected_ids),"selected_ids-----")
96 #if type(selected_ids)!='str':
97 #selected_ids = json.loads(selected_ids)#进行转换数据
98 print(selected_ids,type(action),action,"selected_ids==========")
99 #print("action:",selected_ids,action)
100 if selected_ids :
101 #selected_ids = json.loads(selected_ids)#进行转换数据
102 selected_objs = admin_obj.model.objects.filter(id__in=selected_ids.split(','))#返回之前所选中的条件
103 else:
104 raise KeyError('错误,没有选择对象!')
105
106 if hasattr(admin_obj,action):
107 action_func = getattr(admin_obj,action)#如果admin_obj 对象中有属性action 则打印self.action的值,否则打印'not find'
108 request._admin_action=action#添加action内容
109 print(request._admin_action,action,'<--------')
110 return action_func(request,selected_objs)
111 # ————————24PerfectCRM实现King_admin自定义操作数据————————
112
113
114 # ————————09PerfectCRM实现King_admin显示注册表的内容————————
115 admin_obj.querysets = admin_obj.model.objects.all()#取数据 传到 前端
116 # ————————09PerfectCRM实现King_admin显示注册表的内容————————
117
118 # ————————11PerfectCRM实现King_admin分页显示条数————————
119 # from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # 分页功能#放在顶上导入
120 obj_list = admin_obj.model.objects.all()#取数据 传到 前端 #base_admin #获取传过来的所有对象
121
122 # ————————13PerfectCRM实现King_admin分页页数————————
123 queryset, condtions = filter_querysets(request, obj_list) #base_admin # 调用条件过滤
124 # ————————13PerfectCRM实现King_admin分页页数————————
125
126 # ————————18PerfectCRM实现King_admin搜索关键字————————
127 queryset = get_queryset_search_result(request,queryset,admin_obj)##搜索后
128 # ————————18PerfectCRM实现King_admin搜索关键字————————
129
130 # ————————26PerfectCRM实现King_admin自定义排序————————
131 sorted_queryset = get_orderby(request, queryset,admin_obj) #排序后的结果
132 # ————————17PerfectCRM实现King_admin单列排序————————
133 # sorted_queryset = get_orderby(request, queryset) #排序后的结果
134 # ————————15PerfectCRM实现King_admin多条件过滤————————
135 # paginator = Paginator(obj_list,admin_obj.list_per_page) #kingadmin里class CustomerAdmin(BaseAdmin):
136 # paginator = Paginator(queryset, admin_obj.list_per_page)
137 # ————————15PerfectCRM实现King_admin多条件过滤————————
138 paginator = Paginator(sorted_queryset, admin_obj.list_per_page)
139 # ————————17PerfectCRM实现King_admin单列排序————————
140 # ————————26PerfectCRM实现King_admin自定义排序————————
141
142
143 page = request.GET.get('page')
144 try:
145 objs = paginator.page(page) # 当前的页面的数据
146 except PageNotAnInteger:
147 # 如果页面不是一个整数,交付第一页。
148 objs = paginator.page(1)
149 except EmptyPage:
150 # 如果页面的范围(例如9999),交付最后一页的搜索结果。
151 objs = paginator.page(paginator.num_pages)
152 admin_obj.querysets = objs # base_admin
153
154 # ————————13PerfectCRM实现King_admin分页页数————————
155 admin_obj.filter_condtions = condtions # base_admin
156 # ————————13PerfectCRM实现King_admin分页页数————————
157
158 # ————————11PerfectCRM实现King_admin分页显示条数————————
159
160 return render(request,"king_admin/table_data_list.html",locals())
161 # ————————08PerfectCRM实现King_admin显示注册表的字段表头————————
162
163
164
165
166 # ————————17PerfectCRM实现King_admin单列排序————————
167 # def get_orderby(request,queryset):
168 # order_by_key = request.GET.get("_o") #获取URL里有没有("_o") <a href="?_o={{ column }}">{{ column }}</a>
169 # #页面刚开始没有这个值
170 # if order_by_key != None: #有("_o")这个值 就进行排序
171 # query_res = queryset.order_by(order_by_key)
172 # else: #没有就不排序,直接返回
173 # query_res = queryset
174 # return query_res #排序时会错
175
176 # orderby_key = request.GET.get("_o")
177 # if orderby_key:
178 # return queryset.order_by(orderby_key)
179 # return queryset
180
181 #在table_data_list添加
182 # def table_data_list(request,app_name,model_name): #详细列表
183 # sorted_queryset = get_orderby(request, queryset)
184 #在filter_querysets添加
185 #if k == "page"or k == "_o": #保留的分页关键字 和 排序关键字
186 # ————————17PerfectCRM实现King_admin单列排序————————
187
188 # ————————26PerfectCRM实现King_admin自定义排序————————
189 def get_orderby(request, queryset, admin_obj):
190 orderby_key = request.GET.get("_o")
191 #order_by_key1=order_by_key.strip()
192 if orderby_key: #有获取到字段
193 query_res = queryset.order_by(orderby_key.strip()) #.strip()默认删除空白符(包括'\n', '\r', '\t', ' ')
194 else:
195 if admin_obj.ordering: #查看kingadmin‘有没有 ordering = '-qq' # 自定义排序
196 query_res = queryset.order_by("%s" %admin_obj.ordering)
197 else:
198 query_res = queryset.order_by('-id') #默认倒序
199 return query_res
200
201 #在table_data_list添加
202 # def table_data_list(request,app_name,model_name): #详细列表
203 # sorted_queryset = get_orderby(request, queryset, admin_obj) # 排序后的结果
204 # ————————26PerfectCRM实现King_admin自定义排序————————
205
206
207 # ————————18PerfectCRM实现King_admin搜索关键字————————
208 from django.db.models import Q
209 def get_queryset_search_result(request,queryset,admin_obj):
210 search_key = request.GET.get("_q", "")#取定义名,默认为空
211 q_obj = Q()#多条件搜索 #from django.db.models import Q
212 q_obj.connector = "OR" # or/或 条件
213 for column in admin_obj.search_fields: #搜索目标crm/kingadmin里class CustomerAdmin(BaseAdmin):search_fields = ('name','qq',)
214 q_obj.children.append(("%s__contains" % column, search_key)) #运态添加多个条件
215 res = queryset.filter(q_obj) #对数据库进行条件搜索
216 return res #返回结果
217 #在table_data_list添加
218 #def table_data_list(request,app_name,model_name): #详细列表
219 # queryset = get_queryset_search_result(request,queryset,admin_obj)
220 # ————————18PerfectCRM实现King_admin搜索关键字————————
221
222
223 # ————————19PerfectCRM实现King_admin数据修改————————
224 from king_admin import forms
225 #修改内容
226 # def table_change(request,app_name,model_name):
227 # obj_form = forms.CustomerModelForm() #创建一个空表单
228 # return render(request,"kingadmin/table_change.html",locals())
229 @login_required # 登陆后页面才能访问
230 def table_change(request,app_name,model_name,obj_id):
231 admin_obj = base_admin.site.registered_sites[app_name][model_name] #获取表对象
232 #kingadmin/forms.py里def CreateModelForm(request,admin_obj):
233 model_form = forms.CreateModelForm(request,admin_obj=admin_obj) ##modelform 生成表单 加验证
234 # obj_form = model_form() # 表单
235 obj = admin_obj.model.objects.get(id=obj_id)#根据ID获取数据记录
236
237 # ————————28PerfectCRM实现King_admin编辑限制————————
238 # ————————20PerfectCRM实现King_admin数据修改美化————————
239 # #面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
240 # obj_form = model_form(instance=obj) # 数据传入表单
241
242 if request.method == "GET":#如果是 GET 表示 是添加记录
243 obj_form = model_form(instance=obj)#数据传入表单
244 elif request.method == "POST":#如果是 POST 表示 是修改后的数据
245 obj_form = model_form(instance=obj,data=request.POST)#更新数据
246 if obj_form.is_valid():
247 obj_form.save()
248 # ————————20PerfectCRM实现King_admin数据修改美化————————
249 # ————————28PerfectCRM实现King_admin编辑限制————————
250
251 return render(request,"king_admin/table_change.html",locals())
252 # ————————19PerfectCRM实现King_admin数据修改————————
253
254
255 # ————————21PerfectCRM实现King_admin查看页面美化————————
256 #单个具体app页面
257 @login_required # 登陆后页面才能访问
258 def table_index(request,app_name):
259 bases=base_admin.site.registered_sites[app_name]#取出对应app对象
260 return render(request, 'king_admin/table_index.html', {"site":bases,'app_name':app_name})
261 # ————————21PerfectCRM实现King_admin查看页面美化————————
262
263 # ————————22PerfectCRM实现King_admin数据添加————————
264 from django.shortcuts import redirect # kingadmin添加内容
265 @login_required # 登陆后页面才能访问
266 def table_add(request,app_name,model_name):
267 admin_obj = base_admin.site.registered_sites[app_name][model_name] #获取表对象
268 # ————————32PerfectCRM实现King_admin添加不进行限制————————
269 admin_obj.is_add_form=True#表示为新增表单
270 # ————————32PerfectCRM实现King_admin添加不进行限制————————
271 model_form = forms.CreateModelForm(request,admin_obj=admin_obj) ##modelform 生成表单 加验证
272 if request.method == "GET":
273 obj_form = model_form() #跳转过来的为空
274 elif request.method == "POST":
275 obj_form = model_form(data=request.POST) #创建数据
276
277 # ————————37PerfectCRM实现King_admin添加用户时密码加密————————
278 password=request.POST.get('password') #取前端输入的密码
279 email=request.POST.get('email') #取前端输入的邮箱
280 # ————————37PerfectCRM实现King_admin添加用户时密码加密————————
281
282 if obj_form.is_valid():
283 # ————————32PerfectCRM实现King_admin添加不进行限制————————
284 # obj_form.save()
285 try:
286 obj_form.save()#表单验证通过保存
287 except Exception as e:
288 return redirect("/king_admin/%s/%s/" % (app_name,model_name))#转到之前的页面
289 # ————————32PerfectCRM实现King_admin添加不进行限制————————
290 if not obj_form.errors: #没有错误返回原来的页面
291
292 # ————————37PerfectCRM实现King_admin添加用户时密码加密————————
293 obj=admin_obj.model.objects.filter(email=email).first() # 对象
294 obj.set_password(password) # 加密
295 try:
296 obj.save()#表单验证通过保存
297 except Exception as e:
298 return redirect("/king_admin/%s/%s/" % (app_name, model_name))
299 # ————————37PerfectCRM实现King_admin添加用户时密码加密————————
300
301 #from django.shortcuts import redirect
302 return redirect("/king_admin/%s/%s/" % (app_name,model_name))
303 return render(request, "king_admin/table_add.html", locals())
304 # ————————22PerfectCRM实现King_admin数据添加————————
305
306
307 # ————————23PerfectCRM实现King_admin数据删除————————
308 @login_required # 登陆后页面才能访问
309 def table_delete(request,app_name,model_name,obj_id):
310 admin_obj = base_admin.site.registered_sites[app_name][model_name]#表类
311 objs=admin_obj.model.objects.get(id=obj_id)#类的对象
312
313 # ————————33PerfectCRM实现King_admin编辑整张表限制————————
314 # if request.method=='POST':
315 # objs.delete()#删除
316 # return redirect("/king_admin/%s/%s/" % (app_name,model_name))#转到列表页面
317
318 app_name=app_name
319 if admin_obj.readonly_table:
320 errors={'锁定的表单':'该表单:<%s>,已经锁定,不能删除当前记录!'%model_name}
321 else:
322 errors={}
323 if request.method=='POST':
324 if not admin_obj.readonly_table:
325 objs.delete()#删除
326 return redirect("/king_admin/%s/%s/%s/" % (app_name,model_name,obj_id))#转到列表页面
327 # ————————33PerfectCRM实现King_admin编辑整张表限制————————
328
329
330 return render(request, "king_admin/table_delete.html", locals())#locals 返回一个包含当前范围的局部变量字典。
331 # ————————23PerfectCRM实现King_admin数据删除————————
332
333 # ————————36PerfectCRM实现King_admin密码修改————————
334 #密码修改
335 @login_required # 登陆后页面才能访问
336 def password_reset(request,app_name,model_name,obj_id):
337 admin_obj = base_admin.site.registered_sites[app_name][model_name]#表类
338 model_form = forms.CreateModelForm(request,admin_obj=admin_obj)#modelform 生成表单 加验证
339 obj=admin_obj.model.objects.get(id=obj_id)#类表的对象
340 errors={}#错误提示
341 if request.method=='POST':
342 _password1=request.POST.get('password1') #获取页面输入的值
343 _password2=request.POST.get('password2') #获取页面输入的值
344 if _password1==_password2:
345 if len(_password1)>5:
346 obj.set_password(_password1)#继承Django方法 #加密
347 obj.save() #保存
348 return redirect(request.path.rstrip('password/') + ('/change/')) #替换URL名
349 else:
350 errors['password_too_short']='必须不少于6字符'
351 else:
352 errors['invalid_password']='两次输入的密码不一样'#密码不一致
353
354 return render(request, "king_admin/password_reset.html", locals())#locals 返回一个包含当前范围的局部变量字典。
355 # ————————36PerfectCRM实现King_admin密码修改————————
356
357 # ————————37PerfectCRM实现King_admin添加用户时密码加密————————
358 def password_add(request,app_name,model_name):
359 return redirect("/king_admin/%s/%s/add/" % (app_name, model_name)) # 转到添加页面
360 # ————————37PerfectCRM实现King_admin添加用户时密码加密————————