Django项目:CRM(客户关系管理系统)--37--29PerfectCRM实现King_admin编辑自定义限制

  1 #base_admin.py
  2 
  3 
  4 # ————————24PerfectCRM实现King_admin自定义操作数据————————
  5 from django.shortcuts import render,redirect
  6 # ————————24PerfectCRM实现King_admin自定义操作数据————————
  7 
  8 # ————————04PerfectCRM实现King_admin注册功能————————
  9 
 10 #Django admin 注册功能的形式
 11 # sites = {
 12 #     'crm':{
 13 #         'customers':CustomerAdmin,
 14 #         'customerfollowup':CustomerFollowUPAdmin,
 15 #     }
 16 # }
 17 
 18 class AdminRegisterException(Exception):  #自定义异常
 19     def __init__(self,msg):
 20         self.message = msg
 21 
 22 class BaseAdmin(object):#自定义方法
 23     list_display = ()  #显示的字段(不能包含ManyToManyField)
 24 
 25     # ————————11PerfectCRM实现King_admin分页显示条数————————
 26     list_per_page = 10  # 默认分页条数10
 27     # ————————11PerfectCRM实现King_admin分页显示条数————————
 28 
 29     # ————————15PerfectCRM实现King_admin多条件过滤————————
 30     list_filter = ()        # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
 31     # ————————15PerfectCRM实现King_admin多条件过滤————————
 32 
 33     # ————————18PerfectCRM实现King_admin搜索关键字————————
 34     search_fields = () #搜索(不能包含CharField)(注意加 逗号 , )
 35     # ————————18PerfectCRM实现King_admin搜索关键字————————
 36 
 37     # ————————26PerfectCRM实现King_admin自定义排序————————
 38     ordering = None    #自定义排序
 39     # ————————26PerfectCRM实现King_admin自定义排序————————
 40 
 41     # ————————27PerfectCRM实现King_admin编辑复选框————————
 42     filter_horizontal = []#复选框
 43     # ————————27PerfectCRM实现King_admin编辑复选框————————
 44 
 45 
 46     # ————————24PerfectCRM实现King_admin自定义操作数据————————
 47     actions = []#自定功能
 48 
 49     default_actions = ["delete_selected",]  #默认删除的函数
 50     #默认删除的函数
 51     def delete_selected(self,request,queryset):
 52         # from django.shortcuts import render, redirect
 53         print("goint to delete ",queryset)
 54         app_name=self.model._meta.app_label#app名
 55         model_name=self.model._meta.model_name#表名
 56         objs=queryset#类对象
 57         action=request._admin_action
 58         print(action,'<-------action')
 59         if request.POST.get('delete_confirm')=='yes': #{#table_delete.html#}
 60             queryset.delete()
 61             return redirect('/king_admin/%s/%s/'%(app_name,model_name))
 62         selected_ids=','.join([str(i.id) for i in queryset])
 63         print(selected_ids,'<---selected_ids')
 64         objs=queryset
 65         return render(request,"king_admin/table_delete.html", locals())  #返回删除页
 66     delete_selected.short_description = "默认批量删除"
 67     # ————————24PerfectCRM实现King_admin自定义操作数据————————
 68 
 69     # ————————28PerfectCRM实现King_admin编辑限制————————
 70     readonly_fields = [] # 不可修改
 71 
 72     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
 73     #默认表单验证 全部 可重写
 74     def default_form_validation(self,request):
 75         #用户可以在此进行自定义的表单验证,相当于django form 的clean方法
 76         '''默认表单验证  ==  django form 的clean方法'''
 77         pass
 78     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
 79     # ————————28PerfectCRM实现King_admin编辑限制————————
 80 
 81     
 82 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
 83 class AdminSite(object):
 84     def __init__(self):
 85         self.registered_sites = {}   #传到views 里调用
 86     def register(self,model,admin_class=None): #默认值None 使用 BaseAdmin
 87         app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
 88         model_name = model._meta.model_name#用内置方法获取 表名  (Customer)
 89         if app_name not in self.registered_sites:
 90             self.registered_sites[app_name] = {} #创建  crm={}
 91         if model_name in self.registered_sites[app_name]:
 92             raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
 93                                                  %(app_name,model_name))#自定义异常,
 94         if not  admin_class:
 95             admin_class = BaseAdmin  #默认值None 使用 BaseAdmin
 96         # self.registered_sites[app_name][model_name] = admin_class #注册APP
 97 # site = AdminSite()  # 实例化类  单例模式
 98 
 99 
100         # ————————05PerfectCRM实现King_admin注册功能获取内存————————
101         #registered_sites {'crm': {'customer': <class 'crm.kingadmin.CustomerAdmin'>, 'courserecord': <class 'kingadmin.base_admin.BaseAdmin'>}}
102         #把类名放到class的对象里,然后通过class的对象传到前端
103 #         admin_class.model = model
104 #         self.registered_sites[app_name][model_name] = admin_class #注册APP
105 #
106 # site = AdminSite() #实例化类  单例模式
107         # ————————05PerfectCRM实现King_admin注册功能获取内存————————
108 
109         # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
110         #没有实例化会使用同一个内存地址
111         admin_obj = admin_class()  #先实例化
112         admin_obj.model = model    #参数赋值给实例
113         self.registered_sites[app_name][model_name] = admin_obj#注册APP
114         #实例化后,调用会使用不同的内存地址
115 
116 site = AdminSite() #实例化类  单例模式
117         # ————————06PerfectCRM实现King_admin注册功能获取内存优化处理————————
118         
119 # registered_sites={}
120 # def register(model,admin_class=None): #默认值None 使用 BaseAdmin
121 #     app_name = model._meta.app_label#用内置方法获取 APP名字 (crm)
122 #     model_name = model._meta.model_name#用内置方法获取 表名  (Customer)
123 #     if app_name not in registered_sites:
124 #         registered_sites[app_name] = {} #创建  crm={}
125 #     if model_name in registered_sites[app_name]:
126 #         raise AdminRegisterException("app [%s] model [%s] has already registered!异常"
127 #                                              %(app_name,model_name))#自定义异常
128 #     if not admin_class:
129 #         admin_class = BaseAdmin  #默认值None 使用class BaseAdmin
130 #     registered_sites[app_name][model_name] = admin_class #注册APP
131 
132 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
133 
134 # ————————04PerfectCRM实现King_admin注册功能————————
#base_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 # ————————28PerfectCRM实现King_admin编辑限制————————
16 from django.forms import ValidationError
17 from django.shortcuts import render,redirect
18 # ————————28PerfectCRM实现King_admin编辑限制————————
19 
20 #04客户信息表
21 class CustomerAdmin(BaseAdmin):#定制Djanago admin
22     list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date')  # 显示字段表头
23 
24     # ————————11PerfectCRM实现King_admin分页显示条数————————
25     list_per_page = 2  #分页条数  # 默认分页条数10
26     # ————————11PerfectCRM实现King_admin分页显示条数————————
27 
28     # ————————16PerfectCRM实现King_admin日期过滤————————
29     # ————————15PerfectCRM实现King_admin多条件过滤————————
30     # 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
31     # list_filter = ('source','consultant','consult_courses',)
32     list_filter = ('date','source','consultant','consult_courses',)
33     # ————————15PerfectCRM实现King_admin多条件过滤————————
34     # ————————16PerfectCRM实现King_admin日期过滤————————
35 
36     # ————————18PerfectCRM实现King_admin搜索关键字————————
37     #搜索(不能包含CharField)(注意加 逗号 , )
38     search_fields = ('name','qq',)
39     # ————————18PerfectCRM实现King_admin搜索关键字————————
40 
41     # ————————26PerfectCRM实现King_admin自定义排序————————
42     ordering = '-qq'  #自定义排序,默认'-id'
43     # ————————26PerfectCRM实现King_admin自定义排序————————
44 
45     # ————————27PerfectCRM实现King_admin编辑复选框————————
46     filter_horizontal = ('tags',) #复选框
47     # ————————27PerfectCRM实现King_admin编辑复选框————————
48 
49 
50 
51     # ————————24PerfectCRM实现King_admin自定义操作数据————————
52     # from django.shortcuts import render
53     actions = ['test_actions',]#定制功能    #测试返回到一个新页面
54     def test_actions(self,request,arg2):#对应的函数 #request类自己的请求  #arg2类的内容
55         return render(request,"king_admin/table_index.html")
56     test_actions.short_description = "测试显示中文"
57     # ————————24PerfectCRM实现King_admin自定义操作数据————————
58 
59     # ————————28PerfectCRM实现King_admin编辑限制————————
60     readonly_fields = ('qq', 'consultant',)  # 不可修改
61 
62     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
63     def default_form_validation(self,obj):
64         print('validation:制定的',obj.cleaned_data)
65         consult_course=obj.cleaned_data.get('content','')#自制验证字段
66         if len(consult_course)<10:
67             return ValidationError(#添加错误信息 返回
68                                 ("该字段%(field)s 咨询内容记录不能少于10个字符"),
69                                 code='invalid',
70                                 params={'field':'content',},
71                             )
72     # ————————29PerfectCRM实现King_admin编辑自定义限制————————
73     # ————————28PerfectCRM实现King_admin编辑限制————————
74     
75 
76 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
77 # register(models.Customer,CustomerAdmin)
78 # register(models.CourseRecord)
79 site.register(models.Customer,CustomerAdmin)
80 site.register(models.CourseRecord)
81 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
82 
83 # ————————04PerfectCRM实现King_admin注册功能————————
# kingadmin.py

 1 # forms.py
 2 # ————————19PerfectCRM实现King_admin数据修改————————
 3 from django import forms
 4 from crm import models
 5 
 6 # class CustomerModelForm(forms.ModelForm):
 7 #     class Meta: #调用内置方法
 8 #         model = models.Customer  #获取表名
 9 #         fields = "__all__"   #字段
10 
11 def CreateModelForm(request,admin_obj):
12     class Meta: #调用内置方法
13         model = admin_obj.model  #获取表名
14         fields = "__all__"   #字段
15     # ————————20PerfectCRM实现King_admin数据修改美化————————
16         # type()就是一个最实用又简单的查看数据类型的方法。type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查询的对像类型信息。
17         # dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta})  #生成modelform的类,
18     # new()方法是在类准备将自身实例化时调用。new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
19     def __new__(cls, *args, **kwargs):#重写 函数生成方法
20         # print("base fields",cls.base_fields)
21         # 字段名    #字段数据
22         for field_name, field_obj in cls.base_fields.items():
23             # print(field_name,dir(field_obj))
24             field_obj.widget.attrs['class'] = 'form-control'  # 前端的样式
25             # field_obj.widget.attrs['maxlength'] = getattr(field_obj,'max_length' ) if hasattr(field_obj,'max_length') 
26             #     else ""
27             # ————————28PerfectCRM实现King_admin编辑限制————————
28             if field_name in admin_obj.readonly_fields:#如果,在
29                 field_obj.widget.attrs['disabled'] = True
30             # ————————28PerfectCRM实现King_admin编辑限制————————
31         return forms.ModelForm.__new__(cls)
32     # ————————28PerfectCRM实现King_admin编辑限制————————
33     def default_clean(self):
34         #给所有的form默认加一个 clean  验证
35         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
36         from django.forms import ValidationError
37         error_list = []
38         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
39 
40         print("default clean:",self)#得到整个form数据
41         for field in admin_obj.readonly_fields:#循环获取crm/kingadmin.py里    readonly_fields = ('name','qq',)的数据
42             print("readonly",field,self.instance)#获取到 字段名 ,对象(值)
43             field_val_from_db  = getattr(self.instance,field)#获取数据库的值
44             print("cleaned data:", self.cleaned_data)#获取到 前端的值
45             field_val = self.cleaned_data.get(field)#获取到 前端的值
46             if field_val_from_db == field_val:#数据库的值和前端的值对比
47                 print("数据库数据和前端数据一样 ")
48             else: # 被篡改了
49                 self.add_error(field,' "%s" 是一个只读的字段,值应该是 "%s"! 大神请不要篡改!!!'% (field, field_val_from_db))
50                 
51         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
52         response=admin_obj.default_form_validation(self)#可自定制
53         if response:
54             error_list.append(response)
55         if error_list:
56             raise ValidationError(error_list)
57         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
58 
59     # ————————28PerfectCRM实现King_admin编辑限制————————
60     dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta})  # 生成modelform的类,
61     setattr(dynamic_model_form, "__new__", __new__)
62     # ————————20PerfectCRM实现King_admin数据修改美化————————
63     # ————————28PerfectCRM实现King_admin编辑限制————————
64     setattr(dynamic_model_form,"clean",default_clean)  #给所有的form默认加一个 clean  验证
65     # ————————28PerfectCRM实现King_admin编辑限制———————
66     return dynamic_model_form
67 # ————————19PerfectCRM实现King_admin数据修改————————
# forms.py

原文地址:https://www.cnblogs.com/ujq3/p/8707858.html