博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django项目:CRM(客户关系管理系统)--39--31PerfectCRM实现King_admin编辑多对多限制
阅读量:4457 次
发布时间:2019-06-08

本文共 12792 字,大约阅读时间需要 42 分钟。

 

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数据修改————————
# 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
22
31 {## ————————25PerfectCRM实现King_admin添加出错修复————————#} 32 {#

修改:{% get_model_verbose_name admin_obj.model %}

#} 33 34 {% block Tops %} 35
36

修改: {% get_model_verbose_name admin_obj.model %}

37
38 {% endblock %} 39 {## ————————25PerfectCRM实现King_admin添加出错修复————————#} 40
41 42
43 {
{ obj_form.errors }} 44 45 {## ————————28PerfectCRM实现King_admin编辑限制————————#} 46 {## ————————27PerfectCRM实现King_admin编辑复选框————————#} 47 {#
{% csrf_token %}#} 48 {% csrf_token %} 49 {## ————————27PerfectCRM实现King_admin编辑复选框————————#} 50 {## ————————28PerfectCRM实现King_admin编辑限制————————#} 51 52 {% for field in obj_form %} 53
54
62
63
{
{ field.errors }}
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
73
74 {% get_m2m_available_objs admin_obj field.name as m2m_available_objs %} 75 {#
#} 76
77
97
98
99
100

待选 ->

101

双击选择

102

<- 已选

103
104 105
106
107
123 124
125 126 {% else %}127 128 {## ————————30PerfectCRM实现King_admin编辑自定义字段验证————————#}129 {
{ field }}
{
{ field.help_text }}
130 {#
{
{ field.errors }}
#}131 {## ————————30PerfectCRM实现King_admin编辑自定义字段验证————————#}132 133 134 {% endif %}
135 {## ————————27PerfectCRM实现King_admin编辑复选框————————#}136 137 138 139
140
141 {% endfor %}142 143 {## ————————25PerfectCRM实现King_admin添加出错修复————————#}144 {## ————————23PerfectCRM实现King_admin数据删除————————#}145 {#
删除#}146 {## ————————23PerfectCRM实现King_admin数据删除————————#}147 {#
{#放右边#}148 149
150 {% block del %}151
152
删除153
154 {% endblock %}155
156
157
158
159 {## ————————25PerfectCRM实现King_admin添加出错修复————————#}160 161
162
163 164 165 166 167 168 {% endblock %}169 {## ————————20PerfectCRM实现King_admin数据修改美化————————#}
{#table_change.html#}

 

 

 

 

转载于:https://www.cnblogs.com/ujq3/p/8711292.html

你可能感兴趣的文章
Android Activity整体管理和关闭工具类封装
查看>>
nginx 安装
查看>>
路径寻找(隐式图遍历)
查看>>
selenium下拉一个框内的滚动条
查看>>
跟老邓一起学Windows Phone7开发(一)第一个程序
查看>>
未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
查看>>
Android电源管理
查看>>
C#_基础_方法以及方法重载(十)
查看>>
新起点新希望
查看>>
php 做数学运算时结果为0的原因
查看>>
LINQ系列:LINQ to DataSet的DataTable操作
查看>>
ASP。net 测验
查看>>
java开发环境搭建-慕课网
查看>>
NOIP2015-D2T3运输计划
查看>>
Z :彻底了解指针数组,数组指针以及函数指针 [复
查看>>
用的好好的,Cygwin变的不好用了。
查看>>
2013年终总结
查看>>
在IIS中部署.net core应用
查看>>
hihocoder编程练习赛52-3 部门聚会
查看>>
CF1059C Sequence Transformation
查看>>