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