readonly_fields = ('qq', 'consultant','tags',) # 不可修改
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 51 # ————————31PerfectCRM实现King_admin编辑多对多限制———————— 52 if hasattr(field_val_from_db,'select_related'):#多对多 53 m2m_objs=getattr(field_val_from_db,'select_related')().select_related()#调用多对多,获取对应的值 54 m2m_vals=[i[0] for i in m2m_objs.values_list('id')]#转为列表 55 set_m2m_vals=set(m2m_vals)#转集合 交集 数据库 56 57 # vals_from_frontend=self.cleaned_data.get(field)#前端的值 交集 58 # m2m_vals=[i[0] for i in vals_from_frontend.values_list('id')]#转为列表 59 # print(vals_from_frontend,'前端的值 交集',m2m_vals) 60 61 set_m2m_vals_from_frontend=set([i.id for i in self.cleaned_data.get(field)])#前端的值 交集 62 from django.utils.translation import ugettext as _ # 国际化 63 if set_m2m_vals != set_m2m_vals_from_frontend: 64 error_list.append(ValidationError( 65 _("%(field)s: 该字段不可修改!"), 66 code='invalid', 67 params={ 'field':field,} 68 )) 69 self.add_error(field,"不可修改!") 70 continue 71 72 #field_val = self.cleaned_data.get(field)#前端传来的值 73 #print('field_val',type(field_val)) 74 if field_val_from_db != field_val: 75 print("field not change ")#不一致 76 error_list.append(ValidationError(#添加错误信息 77 _("该字段%(field)s 不可修改,原值为: %(val)s"), 78 code='invalid', 79 params={ 'field':field,'val':field_val_from_db} 80 )) 81 82 # else: # 被篡改了 83 # self.add_error(field,' "%s" is a readonly field ,value should be "%s" '% (field, field_val_from_db)) 84 85 # ————————31PerfectCRM实现King_admin编辑多对多限制———————— 86 87 #print("cleaned data:",self.cleaned_data,)#要验证的表单 88 for field in self.cleaned_data:#单独字段 89 if hasattr(admin_obj,'clean_%s'%field):#是否有该字段的单独验证 90 field_clean_func=getattr(admin_obj,'clean_%s'%field)#获取对应的函数 91 response=field_clean_func(self)# 92 if response: 93 error_list.append(response) 94 if error_list: 95 raise ValidationError(error_list) 96 #response_sol=admin_obj.('clean_%s'%field)(self.cleaned_data) 97 # ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— 98 99 100 # ————————31PerfectCRM实现King_admin编辑多对多限制————————101 # print("default clean:",self)#得到整个form数据102 # for field in admin_obj.readonly_fields:#循环获取crm/kingadmin.py里 readonly_fields = ('name','qq',)的数据103 # print("readonly",field,self.instance)#获取到 字段名 ,对象(值)104 # field_val_from_db = getattr(self.instance,field)#获取数据库的值105 # print("cleaned data:", self.cleaned_data)#获取到 前端的值106 # field_val = self.cleaned_data.get(field)#获取到 前端的值107 #108 # if field_val_from_db == field_val:#数据库的值和前端的值对比109 # print("数据库数据和前端数据一样 ")110 # else: # 被篡改了111 # self.add_error(field,' "%s" 是一个只读的字段,值应该是 "%s"! 大神请不要篡改!!!'% (field, field_val_from_db))112 # ————————31PerfectCRM实现King_admin编辑多对多限制————————113 114 115 # ————————29PerfectCRM实现King_admin编辑自定义限制————————116 response=admin_obj.default_form_validation(self)#可自定制117 if response:118 error_list.append(response)119 if error_list:120 raise ValidationError(error_list)121 # ————————29PerfectCRM实现King_admin编辑自定义限制————————122 123 # ————————28PerfectCRM实现King_admin编辑限制————————124 125 dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), { "Meta": Meta}) # 生成modelform的类,126 setattr(dynamic_model_form, "__new__", __new__)127 # ————————20PerfectCRM实现King_admin数据修改美化————————128 129 # ————————28PerfectCRM实现King_admin编辑限制————————130 setattr(dynamic_model_form,"clean",default_clean) #给所有的form默认加一个 clean 验证131 # ————————28PerfectCRM实现King_admin编辑限制—————132 133 return dynamic_model_form134 # ————————19PerfectCRM实现King_admin数据修改————————
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 %} 212241 42 31 {## ————————25PerfectCRM实现King_admin添加出错修复————————#} 32 {#修改:{% get_model_verbose_name admin_obj.model %}
#} 33 34 {% block Tops %} 353638 {% endblock %} 39 {## ————————25PerfectCRM实现King_admin添加出错修复————————#} 40修改: {% get_model_verbose_name admin_obj.model %}
3743 { { obj_form.errors }} 44 45 {## ————————28PerfectCRM实现King_admin编辑限制————————#} 46 {## ————————27PerfectCRM实现King_admin编辑复选框————————#} 47 {# 162163 164 165 166 167 168 {% endblock %}169 {## ————————20PerfectCRM实现King_admin数据修改美化————————#}