Django项目:CRM(客户关系管理系统)--38--30PerfectCRM实现King_admin编辑自定义字段验证

# kingadmin.py
# ————————04PerfectCRM实现King_admin注册功能————————
from crm import models
#print("kingadmin crm",models.Customer) # ————————05PerfectCRM实现King_admin注册功能获取内存————————
# from king_admin.base_admin import register,BaseAdmin
from king_admin.base_admin import site,BaseAdmin
# ————————05PerfectCRM实现King_admin注册功能获取内存———————— # ————————24PerfectCRM实现King_admin自定义操作数据————————
from django.shortcuts import render
# ————————24PerfectCRM实现King_admin自定义操作数据———————— # ————————28PerfectCRM实现King_admin编辑限制————————
from django.forms import ValidationError
from django.shortcuts import render,redirect
# ————————28PerfectCRM实现King_admin编辑限制———————— #04客户信息表
class CustomerAdmin(BaseAdmin):#定制Djanago admin
list_display = ('id', 'qq', 'source', 'consultant', 'content', 'date') # 显示字段表头 # ————————11PerfectCRM实现King_admin分页显示条数————————
list_per_page = 2 #分页条数 # 默认分页条数10
# ————————11PerfectCRM实现King_admin分页显示条数———————— # ————————16PerfectCRM实现King_admin日期过滤————————
# ————————15PerfectCRM实现King_admin多条件过滤————————
# 过滤器(可以包含ManyToManyField) (注意加 逗号 , )
# list_filter = ('source','consultant','consult_courses',)
list_filter = ('date','source','consultant','consult_courses',)
# ————————15PerfectCRM实现King_admin多条件过滤————————
# ————————16PerfectCRM实现King_admin日期过滤———————— # ————————18PerfectCRM实现King_admin搜索关键字————————
#搜索(不能包含CharField)(注意加 逗号 , )
search_fields = ('name','qq',)
# ————————18PerfectCRM实现King_admin搜索关键字———————— # ————————26PerfectCRM实现King_admin自定义排序————————
ordering = '-qq' #自定义排序,默认'-id'
# ————————26PerfectCRM实现King_admin自定义排序———————— # ————————27PerfectCRM实现King_admin编辑复选框————————
filter_horizontal = ('tags',) #复选框
# ————————27PerfectCRM实现King_admin编辑复选框———————— # ————————24PerfectCRM实现King_admin自定义操作数据————————
# from django.shortcuts import render
actions = ['test_actions',]#定制功能 #测试返回到一个新页面
def test_actions(self,request,arg2):#对应的函数 #request类自己的请求 #arg2类的内容
return render(request,"king_admin/table_index.html")
test_actions.short_description = "测试显示中文"
# ————————24PerfectCRM实现King_admin自定义操作数据———————— # ————————28PerfectCRM实现King_admin编辑限制————————
readonly_fields = ('qq', 'consultant',) # 不可修改 # ————————29PerfectCRM实现King_admin编辑自定义限制————————
def default_form_validation(self,obj):
print('validation:制定的',obj.cleaned_data)
consult_course=obj.cleaned_data.get('content','')#自制验证字段
if len(consult_course)<10:
return ValidationError(#添加错误信息 返回
("该字段%(field)s 咨询内容记录不能少于10个字符"),
code='invalid',
params={'field':'content',},
)
# ————————29PerfectCRM实现King_admin编辑自定义限制————————
# ————————28PerfectCRM实现King_admin编辑限制———————— # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
def clean_name(self,obj,*args,**kwargs):#名称验证 单个
name=obj.cleaned_data['name']
if not name:
obj.add_error('name','不能为空!')
return ValidationError(#添加错误信息 返回
("%(field)s:该字段 不能为空"),
code='invalid',
params={'field':'name',},
)
elif len(name)<5:
obj.add_error('name','不能小于5个字符!')
#return ValidationError('',)
return ValidationError(#添加错误信息 返回
("%(field)s:该字段 不能小于5个字符!"),
code='invalid',
params={'field':'name',},
)
# ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— # ————————05PerfectCRM实现King_admin注册功能获取内存————————
# register(models.Customer,CustomerAdmin)
# register(models.CourseRecord)
site.register(models.Customer,CustomerAdmin)
site.register(models.CourseRecord)
# ————————05PerfectCRM实现King_admin注册功能获取内存———————— # ————————04PerfectCRM实现King_admin注册功能————————
# kingadmin.py

# forms.py
# ————————19PerfectCRM实现King_admin数据修改————————
from django import forms
from crm import models # class CustomerModelForm(forms.ModelForm):
# class Meta: #调用内置方法
# model = models.Customer #获取表名
# fields = "__all__" #字段 def CreateModelForm(request,admin_obj):
class Meta: #调用内置方法
model = admin_obj.model #获取表名
fields = "__all__" #字段
# ————————20PerfectCRM实现King_admin数据修改美化————————
# type()就是一个最实用又简单的查看数据类型的方法。type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查询的对像类型信息。
# dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta}) #生成modelform的类,
# new()方法是在类准备将自身实例化时调用。new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
def __new__(cls, *args, **kwargs):#重写 函数生成方法
# print("base fields",cls.base_fields)
# 字段名 #字段数据
for field_name, field_obj in cls.base_fields.items():
# print(field_name,dir(field_obj))
field_obj.widget.attrs['class'] = 'form-control' # 前端的样式
# field_obj.widget.attrs['maxlength'] = getattr(field_obj,'max_length' ) if hasattr(field_obj,'max_length') \
# else ""
# ————————28PerfectCRM实现King_admin编辑限制————————
if field_name in admin_obj.readonly_fields:#如果,在
field_obj.widget.attrs['disabled'] = True
# ————————28PerfectCRM实现King_admin编辑限制———————— return forms.ModelForm.__new__(cls) # ————————28PerfectCRM实现King_admin编辑限制————————
def default_clean(self):
#给所有的form默认加一个 clean 验证 # ————————29PerfectCRM实现King_admin编辑自定义限制————————
from django.forms import ValidationError
error_list = []
# ————————29PerfectCRM实现King_admin编辑自定义限制———————— # ————————30PerfectCRM实现King_admin编辑自定义字段验证————————
if self.instance.id: # 表示为修改表单
for field in admin_obj.readonly_fields: # 如果是不可修改的字段
# print("readonly",field,self.instance)
# field_val_from_db = getattr(self.instance,field)#取数据库中的值
field_val_from_db = getattr(self.instance, field) # 取数据库中的值
field_val = self.cleaned_data.get(field) # 前端传来的值
#print("cleaned data:",self.cleaned_data,)#要验证的表单
for field in self.cleaned_data:#单独字段
if hasattr(admin_obj,'clean_%s'%field):#是否有该字段的单独验证
field_clean_func=getattr(admin_obj,'clean_%s'%field)#获取对应的函数
response=field_clean_func(self)#
if response:
error_list.append(response)
if error_list:
raise ValidationError(error_list)
#response_sol=admin_obj.('clean_%s'%field)(self.cleaned_data)
# ————————30PerfectCRM实现King_admin编辑自定义字段验证———————— print("default clean:",self)#得到整个form数据
for field in admin_obj.readonly_fields:#循环获取crm/kingadmin.py里 readonly_fields = ('name','qq',)的数据
print("readonly",field,self.instance)#获取到 字段名 ,对象(值)
field_val_from_db = getattr(self.instance,field)#获取数据库的值
print("cleaned data:", self.cleaned_data)#获取到 前端的值
field_val = self.cleaned_data.get(field)#获取到 前端的值 if field_val_from_db == field_val:#数据库的值和前端的值对比
print("数据库数据和前端数据一样 ")
else: # 被篡改了
self.add_error(field,' "%s" 是一个只读的字段,值应该是 "%s"! 大神请不要篡改!!!'% (field, field_val_from_db)) # ————————29PerfectCRM实现King_admin编辑自定义限制————————
response=admin_obj.default_form_validation(self)#可自定制
if response:
error_list.append(response)
if error_list:
raise ValidationError(error_list)
# ————————29PerfectCRM实现King_admin编辑自定义限制———————— # ————————28PerfectCRM实现King_admin编辑限制———————— dynamic_model_form = type("DynamicModelForm", (forms.ModelForm,), {"Meta": Meta}) # 生成modelform的类,
setattr(dynamic_model_form, "__new__", __new__)
# ————————20PerfectCRM实现King_admin数据修改美化———————— # ————————28PerfectCRM实现King_admin编辑限制————————
setattr(dynamic_model_form,"clean",default_clean) #给所有的form默认加一个 clean 验证
# ————————28PerfectCRM实现King_admin编辑限制————— return dynamic_model_form
# ————————19PerfectCRM实现King_admin数据修改————————
# forms.py

{#table_change.html#}
{## ————————19PerfectCRM实现King_admin数据修改————————#}
{#{% extends "king_master/king_index.html" %}#}
{##}
{#{% load kingadmin_tags %}#}
{#{% block right-container-content %}#}
{##}
{# {{ obj_form }}#}
{##}
{#{% endblock %}#}
{## ————————19PerfectCRM实现King_admin数据修改————————#}
{## ————————20PerfectCRM实现King_admin数据修改美化————————#}
{% extends 'king_master/king_index.html' %} {#继承模板#}
{% load kingadmin_tags %} {#通过自己定义标签获取中文,Django中利用filter与simple_tag为前端自定义函数的实现方法#}
{% block right-container-content %}
<div class="row" style="margin-bottom: 20px" >
<ol class="breadcrumb">
<li><a href="/king_admin/">主页</a></li>
<li><a href="/king_admin/{% get_app_name admin_obj.model %}/">{% get_app_name admin_obj.model %}</a></li>
<li><a href="/king_admin/{% get_app_name admin_obj.model %}/{% get_model_name admin_obj.model %}/">
{% get_model_verbose_name admin_obj.model%} </a></li>
{% if not admin_obj.is_add_form %} {# 新建时 ForeignKey不能实例化 #}
<li class="active">{{ obj_form.instance }}</li> {# 修改时 实例化 #}
{% endif %}
</ol>
{## ————————25PerfectCRM实现King_admin添加出错修复————————#}
{# <h4>修改:{% get_model_verbose_name admin_obj.model %}</h4>#}
{% block Tops %}
<div class="panel panel-info">
<h4 style='color: red'>修改: {% get_model_verbose_name admin_obj.model %}</h4>
</div>
{% endblock %}
{## ————————25PerfectCRM实现King_admin添加出错修复————————#}
</div>
<div class="row">
{{ obj_form.errors }}
{## ————————28PerfectCRM实现King_admin编辑限制————————#}
{## ————————27PerfectCRM实现King_admin编辑复选框————————#}
{#<form class="form-horizontal" method="post" >{% csrf_token %}#}
<form class="form-horizontal" method="post" onsubmit="return BeforeFormSubmit(this);">{% csrf_token %}
{## ————————27PerfectCRM实现King_admin编辑复选框————————#}
{## ————————28PerfectCRM实现King_admin编辑限制————————#}
{% for field in obj_form %}
<div class="form-group">
<label class="col-sm-2 " style="font-weight: normal"> {#字体#}
{% if field.field.required %} {#required判断是不是必须填写#}
<b>{{ field.label }}</b>
{% else %}
{{ field.label }}
{% endif %}
</label>
<div class="col-sm-10" >
<span style="color: red;">{{ field.errors }}</span>
{## ————————27PerfectCRM实现King_admin编辑复选框————————#}
{# {{ field }}#}
{% if field.name in admin_obj.filter_horizontal %} <!-- 水平--><!-- 判断是否复选框-->
{% get_m2m_chosen_objs admin_obj field.name obj_form.instance as m2m_chosen_objs %} <!--当前对象已经选中的字段名-->
<!-- 左边待选框-->
<div class="col-md-6">
<!-- 取所有的内容-->
{% get_m2m_available_objs admin_obj field.name as m2m_available_objs %}
{# <input type="text" oninput="FuzzSearch(this,'id_{{ field.name }}_from')" class="form-control">#}
<!-- 字段名-->
<select multiple field_name="{{ field.name }}" class="form-control filter-select-box" id="id_{{ field.name }}_from" >
<!-- 字段名 是否为不能修改-->
{% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
{% for obj in m2m_available_objs %}
{% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
<option value="{{ obj.id }}" disabled>{{ obj }}</option>
{% endif %}
{% endfor %}
{% else %}
{% for obj in m2m_available_objs %}
{% if obj not in m2m_chosen_objs %}<!--不在当象已经选中的字段名 才显示-->
<option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_to')">{{ obj }}</option>
{% endif %}
{% endfor %}
{% endif %}
</select>
</div>
<!-- 中间箭头-->
<div class="col-md-1">
<div><h4 style='color: #00ff06'>待选 -> </h4></div>
<div><h4 style='color: #8dffc5'>双击选择 </h4></div>
<div><h4 style='color: #ff0003'> <- 已选 </h4></div>
</div>
<!-- 右边已选框-->
<div class="col-md-5">
<select m2m_right="yes" name="{{ field.name }}" multiple field_name="{{ field.name }}" class="form-control" id="id_{{ field.name }}_to">
{% if field.name in admin_obj.readonly_fields and not admin_obj.is_add_form %}
{% for obj in m2m_chosen_objs %}
<option value="{{ obj.id }}" disabled>{{ obj }}</option>
{% endfor %}
{% else %}
{% for obj in m2m_chosen_objs %}
<option value="{{ obj.id }}" ondblclick="MoveEleTo(this,'id_{{ field.name }}_from')">{{ obj }}</option>
{% endfor %}
{% endif %}
</select>
</div>
{% else %}
{## ————————30PerfectCRM实现King_admin编辑自定义字段验证————————#}
{{ field }} <span style="color: #bce8f1"> {{ field.help_text }}</span>
{# <span style="color:red">{{ field.errors }}</span>#}
{## ————————30PerfectCRM实现King_admin编辑自定义字段验证————————#}
{% endif %} <!-- 判断是否复选框-->
{## ————————27PerfectCRM实现King_admin编辑复选框————————#}
</div>
</div>
{% endfor %}
{## ————————25PerfectCRM实现King_admin添加出错修复————————#}
{## ————————23PerfectCRM实现King_admin数据删除————————#}
{# <a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>#}
{## ————————23PerfectCRM实现King_admin数据删除————————#}
{# <input type="submit" value="保存" class="pull-right btn btn-info" > {#放右边#}
<div class="form-group">
{% block del %}
<div class="col-sm-2">
<a class="btn btn-danger" href="{% url 'table_delete' app_name model_name obj_form.instance.id %}">删除</a>
</div>
{% endblock %}
<div class="col-sm-10">
<input type="submit" value="保存" class="pull-right btn btn-info">
</div>
</div>
{## ————————25PerfectCRM实现King_admin添加出错修复————————#}
</form>
</div>
{% endblock %}
{## ————————20PerfectCRM实现King_admin数据修改美化————————#}
{#table_change.html#}


Django项目:CRM(客户关系管理系统)--38--30PerfectCRM实现King_admin编辑自定义字段验证的更多相关文章
- Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- Django项目:CRM(客户关系管理系统)--65--55PerfectCRM实现CRM客户报名状态颜色变化
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- Django项目:CRM(客户关系管理系统)--64--54PerfectCRM实现CRM客户报名链接
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- Django项目:CRM(客户关系管理系统)--42--34PerfectCRM实现CRM自定义用户
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- Django项目:CRM(客户关系管理系统)--72--62PerfectCRM实现CRM讲师讲课记录
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--68--58PerfectCRM实现king_admin批量生成上课记录
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
- Django项目:CRM(客户关系管理系统)--66--56PerfectCRM实现CRM客户报名缴费链接
# kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...
随机推荐
- JS流程控制语句 二选一 (if...else语句) 语法: if(条件) { 条件成立时执行的代码} else {条件不成立时执行的代码}
二选一 (if...else语句) if...else语句是在指定的条件成立时执行代码,在条件不成立时执行else后的代码. 语法: if(条件) { 条件成立时执行的代码} else {条件不成立时 ...
- php非法输入数据类型
1.空白输入 2.超长输入(如大于256个字符) 3.特殊字符(如·!@#¥%……&*()—=|.:‘:<>;'"<>?.,) 4.控制字符(如\r\n等) ...
- ThinkPHP无限分类模块设计
public function catelist(){ $cate=D('Cate'); //var_dump($cate->gettree());exit; $cateres=$cate-&g ...
- Invalid prop: type check failed for prop "maxlength". Expected Number, got String.
1.项目中,使用element-ui的input表单的maxlength属性报错 2.使用场景: <el-input v-model="fname" maxle ...
- 集合划分——cf1028D思维题
非常思维的一道题目,题意很长 给定s1,s2两个集合,s1维护最大值,s2维护最小值,s1的所有元素要比s2小 操作1:往两个集合里的任意一个添加x 操作2:把x从所在的集合里删掉:要求被删的x必须是 ...
- 树形dp——cf1029E
题解给出的是带log的,,我自己写了个on的.. #include<bits/stdc++.h> #include<vector> using namespace std; # ...
- 使用movable-view制作可拖拽的微信小程序弹出层效果。
仿了潮汐睡眠小程序的代码.[如果有侵权联系删除 最近做的项目有个弹出层效果,类似音乐播放器那种.按照普通的做了一般感觉交互不是很优雅,设计妹子把潮汐睡眠的弹层给我看了看,感觉做的挺好,于是乘着有空仿照 ...
- System.Web.Mvc.HttpStatusCodeResult.cs
ylbtech-System.Web.Mvc.HttpStatusCodeResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutra ...
- 表单控件绑定v-model
<!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...
- C++ #define,typedef,using用法区别
一.#define #define 是宏定义命令,宏定义就是将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替,是预编译命令,因此会在预编译阶段被执行 1.无参宏定义 无参宏的宏名 ...