zoukankan      html  css  js  c++  java
  • Django项目:CRM(客户关系管理系统)--38--30PerfectCRM实现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     # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
     76     def clean_name(self,obj,*args,**kwargs):#名称验证 单个
     77         name=obj.cleaned_data['name']
     78         if not name:
     79             obj.add_error('name','不能为空!')
     80             return ValidationError(#添加错误信息 返回
     81                                 ("%(field)s:该字段 不能为空"),
     82                                 code='invalid',
     83                                 params={'field':'name',},
     84                             )
     85         elif len(name)<5:
     86             obj.add_error('name','不能小于5个字符!')
     87             #return ValidationError('',)
     88             return ValidationError(#添加错误信息 返回
     89                                 ("%(field)s:该字段 不能小于5个字符!"),
     90                                 code='invalid',
     91                                 params={'field':'name',},
     92                             )
     93     # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
     94 
     95 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
     96 # register(models.Customer,CustomerAdmin)
     97 # register(models.CourseRecord)
     98 site.register(models.Customer,CustomerAdmin)
     99 site.register(models.CourseRecord)
    100 # ————————05PerfectCRM实现King_admin注册功能获取内存————————
    101 
    102 # ————————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 
    32         return forms.ModelForm.__new__(cls)
    33 
    34     # ————————28PerfectCRM实现King_admin编辑限制————————
    35     def default_clean(self):
    36         #给所有的form默认加一个 clean  验证
    37 
    38         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
    39         from django.forms import ValidationError
    40         error_list = []
    41         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
    42 
    43         # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
    44         if self.instance.id:  # 表示为修改表单
    45             for field in admin_obj.readonly_fields:  # 如果是不可修改的字段
    46                 # print("readonly",field,self.instance)
    47                 # field_val_from_db = getattr(self.instance,field)#取数据库中的值
    48                 field_val_from_db = getattr(self.instance, field)  # 取数据库中的值
    49                 field_val = self.cleaned_data.get(field)  # 前端传来的值
    50         #print("cleaned data:",self.cleaned_data,)#要验证的表单
    51         for field in self.cleaned_data:#单独字段
    52             if hasattr(admin_obj,'clean_%s'%field):#是否有该字段的单独验证
    53                 field_clean_func=getattr(admin_obj,'clean_%s'%field)#获取对应的函数
    54                 response=field_clean_func(self)#
    55                 if response:
    56                     error_list.append(response)
    57                 if error_list:
    58                     raise ValidationError(error_list)
    59                 #response_sol=admin_obj.('clean_%s'%field)(self.cleaned_data)
    60         # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
    61 
    62 
    63         print("default clean:",self)#得到整个form数据
    64         for field in admin_obj.readonly_fields:#循环获取crm/kingadmin.py里    readonly_fields = ('name','qq',)的数据
    65             print("readonly",field,self.instance)#获取到 字段名 ,对象(值)
    66             field_val_from_db  = getattr(self.instance,field)#获取数据库的值
    67             print("cleaned data:", self.cleaned_data)#获取到 前端的值
    68             field_val = self.cleaned_data.get(field)#获取到 前端的值
    69 
    70             if field_val_from_db == field_val:#数据库的值和前端的值对比
    71                 print("数据库数据和前端数据一样 ")
    72             else: # 被篡改了
    73                 self.add_error(field,' "%s" 是一个只读的字段,值应该是 "%s"! 大神请不要篡改!!!'% (field, field_val_from_db))
    74 
    75         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
    76         response=admin_obj.default_form_validation(self)#可自定制
    77         if response:
    78             error_list.append(response)
    79         if error_list:
    80             raise ValidationError(error_list)
    81         # ————————29PerfectCRM实现King_admin编辑自定义限制————————
    82 
    83     # ————————28PerfectCRM实现King_admin编辑限制————————
    84 
    85     dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta})  # 生成modelform的类,
    86     setattr(dynamic_model_form, "__new__", __new__)
    87     # ————————20PerfectCRM实现King_admin数据修改美化————————
    88 
    89     # ————————28PerfectCRM实现King_admin编辑限制————————
    90     setattr(dynamic_model_form,"clean",default_clean)  #给所有的form默认加一个 clean  验证
    91     # ————————28PerfectCRM实现King_admin编辑限制—————
    92 
    93     return dynamic_model_form
    94 # ————————19PerfectCRM实现King_admin数据修改————————
    # forms.py

      1 {#table_change.html#}
      2 {## ————————19PerfectCRM实现King_admin数据修改————————#}
      3 {#{% extends "king_master/king_index.html" %}#}
      4 {##}
      5 {#{% load kingadmin_tags %}#}
      6 {#{% block right-container-content %}#}
      7 {##}
      8 {#      {{ obj_form }}#}
      9 {##}
     10 {#{% endblock %}#}
     11 {## ————————19PerfectCRM实现King_admin数据修改————————#}
     12 
     13 {## ————————20PerfectCRM实现King_admin数据修改美化————————#}
     14 {% extends 'king_master/king_index.html' %}   {#继承模板#}
     15 {% load kingadmin_tags %} {#通过自己定义标签获取中文,Django中利用filter与simple_tag为前端自定义函数的实现方法#}
     16 
     17 
     18 
     19 
     20 {% block right-container-content %}
     21     <div class="row" style="margin-bottom: 20px" >
     22         <ol class="breadcrumb">
     23           <li><a href="/king_admin/">主页</a></li>
     24           <li><a href="/king_admin/{% get_app_name admin_obj.model %}/">{% get_app_name admin_obj.model %}</a></li>
     25           <li><a href="/king_admin/{% get_app_name admin_obj.model %}/{% get_model_name admin_obj.model %}/">
     26               {% get_model_verbose_name admin_obj.model%} </a></li>
     27             {% if not admin_obj.is_add_form %} {#  新建时 ForeignKey不能实例化 #}
     28                <li class="active">{{ obj_form.instance }}</li>  {#  修改时 实例化 #}
     29             {% endif %}
     30         </ol>
     31          {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
     32 {#        <h4>修改:{% get_model_verbose_name admin_obj.model  %}</h4>#}
     33 
     34         {% block Tops %}
     35             <div class="panel panel-info">
     36                 <h4 style='color: red'>修改: {% get_model_verbose_name admin_obj.model %}</h4>
     37             </div>
     38         {% endblock %}
     39          {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
     40     </div>
     41 
     42    <div class="row">
     43         {{ obj_form.errors  }}
     44 
     45         {## ————————28PerfectCRM实现King_admin编辑限制————————#}
     46         {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
     47         {#<form class="form-horizontal" method="post" >{% csrf_token %}#}
     48         <form class="form-horizontal" method="post" onsubmit="return BeforeFormSubmit(this);">{% csrf_token %}
     49         {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
     50         {## ————————28PerfectCRM实现King_admin编辑限制————————#}
     51 
     52             {% for field in obj_form %}
     53                   <div class="form-group">
     54                     <label  class="col-sm-2 " style="font-weight: normal"> {#字体#}
     55                         {% if field.field.required %}   {#required判断是不是必须填写#}
     56                             <b>{{ field.label }}</b>
     57                         {% else %}
     58                             {{ field.label }}
     59                         {% endif %}
     60 
     61                     </label>
     62                     <div class="col-sm-10" >
     63                         <span style="color: red;">{{ field.errors }}</span>
     64 
     65 
     66 
     67                         {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
     68 {#                            {{ field }}#}
     69                         {% if field.name in admin_obj.filter_horizontal %} <!-- 水平--><!--     判断是否复选框-->
     70                             {% get_m2m_chosen_objs admin_obj field.name obj_form.instance as m2m_chosen_objs %} <!--当前对象已经选中的字段名-->
     71                             <!--    左边待选框-->
     72                             <div class="col-md-6">
     73                             <!--    取所有的内容-->
     74                                 {% get_m2m_available_objs admin_obj field.name as m2m_available_objs %}
     75 {#                                <input type="text" oninput="FuzzSearch(this,'id_{{ field.name }}_from')" class="form-control">#}
     76                             <!--                                   字段名-->
     77                                 <select multiple field_name="{{ field.name }}" class="form-control filter-select-box" id="id_{{ field.name }}_from" >
     78                                     <!-- 字段名 是否为不能修改-->
     79                                     {% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
     80                                         {% for obj in m2m_available_objs  %}
     81                                             {% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
     82                                                 <option value="{{ obj.id }}" disabled>{{ obj }}</option>
     83                                             {% endif %}
     84                                         {% endfor %}
     85                                     {% else %}
     86                                         {% for obj in m2m_available_objs %}
     87                                             {% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
     88                                                 <option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_to')">{{ obj }}</option>
     89                                             {% endif %}
     90                                         {% endfor %}
     91                                     {% endif %}
     92                                 </select>
     93                             </div>
     94                             <!--    中间箭头-->
     95                             <div class="col-md-1">
     96                                 <div><h4 style='color: #00ff06'>待选 ->  </h4></div>
     97                                 <div><h4 style='color: #8dffc5'>双击选择 </h4></div>
     98                                 <div><h4 style='color: #ff0003'> <- 已选 </h4></div>
     99                             </div>
    100 
    101                             <!--    右边已选框-->
    102                             <div class="col-md-5">
    103                                 <select m2m_right="yes" name="{{ field.name }}" multiple field_name="{{ field.name }}" class="form-control" id="id_{{ field.name }}_to">
    104                                     {% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
    105                                         {% for obj in m2m_chosen_objs %}
    106                                          <option value="{{ obj.id }}" disabled>{{ obj }}</option>
    107                                         {% endfor %}
    108                                     {% else %}
    109 
    110                                         {% for obj in m2m_chosen_objs %}
    111                                             <option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_from')">{{ obj }}</option>
    112                                         {% endfor %}
    113                                     {% endif %}
    114                                 </select>
    115 
    116                             </div>
    117 
    118                         {% else %}
    119 
    120                             {## ————————30PerfectCRM实现King_admin编辑自定义字段验证————————#}
    121                             {{ field }} <span style="color: #bce8f1"> {{ field.help_text }}</span>
    122 {#                            <span style="color:red">{{ field.errors }}</span>#}
    123                             {## ————————30PerfectCRM实现King_admin编辑自定义字段验证————————#}
    124 
    125 
    126                         {% endif %} <!--     判断是否复选框-->
    127                         {## ————————27PerfectCRM实现King_admin编辑复选框————————#}
    128 
    129 
    130 
    131                     </div>
    132                   </div>
    133             {% endfor %}
    134 
    135             {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
    136             {## ————————23PerfectCRM实现King_admin数据删除————————#}
    137 {#            <a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>#}
    138            {## ————————23PerfectCRM实现King_admin数据删除————————#}
    139 {#            <input type="submit" value="保存" class="pull-right btn btn-info" >   {#放右边#}
    140 
    141             <div class="form-group">
    142                 {% block del %}
    143                     <div class="col-sm-2">
    144                         <a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>
    145                     </div>
    146                 {% endblock %}
    147                 <div class="col-sm-10">
    148                     <input type="submit" value="保存" class="pull-right btn btn-info">
    149                 </div>
    150             </div>
    151             {## ————————25PerfectCRM实现King_admin添加出错修复————————#}
    152 
    153         </form>
    154    </div>
    155 
    156 
    157 
    158     
    159 
    160 {% endblock %}
    161 {## ————————20PerfectCRM实现King_admin数据修改美化————————#}
    {#table_change.html#}

  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/ujq3/p/8711195.html
Copyright © 2011-2022 走看看