zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Some bugs in CE6
    WINCE知识点滴
    多个设备共享同一个硬件中断
    磁盘分区详解
    开发串口驱动程序
    CE BSP开发入门之重要的配置文件
    boost pcre Greta RE2 正则表达式性能测试
    Python GIL
    Oracle Instant Client 安装
    C++ 与 python 整数除法差异
  • 原文地址:https://www.cnblogs.com/ujq3/p/8707858.html
Copyright © 2011-2022 走看看