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注册功能————————
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注册功能————————
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数据修改————————
您的资助是我最大的动力!
金额随意,欢迎来赏!
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【颜言】!