Django项目:CRM(客户关系管理系统)--59--49PerfectCRM实现CRM客户报名流程学生合同表单验证
# sales_views.py
# ————————47PerfectCRM实现CRM客户报名流程————————
from django.db import IntegrityError #主动捕捉错误信息
from django.shortcuts import render #页面返回
from crm import models #数据库
from bpm.bpm_auxiliary import bpm_forms #自定制 forms
from django.contrib.auth.decorators import login_required# 登陆后页面才能访问 # ————————47PerfectCRM实现CRM客户报名流程————————
from django.core.mail import send_mail
# send_mail的参数分别是 邮件标题,邮件内容,发件箱(settings.py中设置过的那个),收件箱列表(可以发送给多个人),失败静默(若发送失败,报错提示我们)
import random
import datetime # 获取时间#登陆过期
#发送邮件的功能 #验证码#密码
class stmp() :
def __init__(self):
self.emaillist=[] #发送给谁
self.code=None #验证码#密码
def stmps(self,request,email,msg_mail): #传参数#页面,session #邮箱,发送给谁 #内容
self.emaillist.append(email) #将邮箱地址添加到调用Django发送邮件功能
# ——————生成验证码——————
_letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
chars = ''.join((_letter_cases, _upper_cases, _numbers)) # 变成一条字符串
list = random.sample(chars, 4) # 从一条字符串随机选4个字符变成列表
self.code = ''.join(list) # 列表变字符串
# ——————生成验证码——————
# ——————调用Django发送邮件——————
title= 'PerfectCRM项目自动邮件:%s'%self.code # 邮件标题#防止一样的内容被邮箱屏蔽
send_mail(title, # 邮件标题
msg_mail, # 验证码内容
'perfectcrm@sina.cn', # 发送的邮箱 #根据情况重新配置
self.emaillist, # 接受的邮箱
fail_silently=False, # 静默,抛出异常
)
print('发送邮件成功!没收到要换标题!检查发送邮箱的配置!')
# ——————调用Django发送邮件—————— # ————————47PerfectCRM实现CRM客户报名流程————————
# ————————47PerfectCRM实现CRM客户报名流程———————— #报名填写 销售
@login_required # 登陆后页面才能访问
def enrollment(request,customer_id):
msgs={} #错误信息
customer_obj=models.Customer.objects.get(id=customer_id)#取到客户信息记录 #返回到页面#报名人
consultant_obj=models.UserProfile.objects.get(id=request.user.id)#报名课程顾问 stmp_mail = {} #邮件发送成功
stmpemail = stmp() #实例化发送邮件的功能
email = request.POST.get('email') # 让页面POST提交的值,在页面GET后仍然存在显示
if request.method=="POST":
enroll_form= bpm_forms.EnrollmentForm(request.POST)#获取数据
if enroll_form.is_valid():#表单验证
msg = "http://127.0.0.1:8000/bpm/customer/registration/{enroll_obj_id}/"
try:
enroll_form.cleaned_data['customer']=customer_obj#添加学员对象 记录 #报名人
enroll_form.cleaned_data['consultant'] = consultant_obj#报名课程顾问
enroll_obj=models.Enrollment.objects.create(**enroll_form.cleaned_data)#创建记录
msgs['msg']=msg.format(enroll_obj_id=enroll_obj.id)#报名记录对应的id
except IntegrityError as e:
#取到这条记录
enroll_obj=models.Enrollment.objects.get(customer_id=customer_obj.id,
enrolled_class_id=enroll_form.cleaned_data['enrolled_class'].id)
enroll_form.add_error('__all__','记录已经存在,不能重复创建!')
msgs['msg']=msg.format(enroll_obj_id=enroll_obj.id)#报名记录对应的id
if email:
msg_mail = "http://127.0.0.1:8000/bpm/customer/registration/%s/"%enroll_obj.id
stmpemail.stmps(request, email,msg_mail) # 发送邮件
stmp_mail['ok'] = "邮件已发送成功!" else:
enroll_form= bpm_forms.EnrollmentForm()#modelform表单
return render(request, 'bpm_sales/enrollment.html', locals())
# ————————47PerfectCRM实现CRM客户报名流程———————— # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
#学员合同签定
def stu_registration(request,enroll_id):
enroll_obj=models.Enrollment.objects.get(id=enroll_id)#获取报名记录
# ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————
if request.method == "POST":
customer_form = bpm_forms.CustomerForm(request.POST, instance=enroll_obj.customer) # 生成表单验证
if customer_form.is_valid(): # 表单验证通过
customer_form.save() # 保存
enroll_obj.contract_agreed = True # 同意协议
enroll_obj.save() # 保存
status = 1 # 修改报名状态 # 1 已经报名
return render(request, 'bpm_sales/stu_registration.html', locals()) else:
if enroll_obj.contract_agreed == True: # 如果协议已经签订
status = 1 # 修改报名状态 # 1 已经报名
else:
status = 0
customer_form = bpm_forms.CustomerForm(instance=enroll_obj.customer) # 生成表单
# customer_form = bpm_forms.CustomerForm(instance=enroll_obj.customer) # 生成表单
# ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证———————— return render(request,'bpm_sales/stu_registration.html',locals())
# ————————48PerfectCRM实现CRM客户报名流程学生合同————————
# sales_views.py
{#stu_registration.html#}
{## ————————48PerfectCRM实现CRM客户报名流程学生合同————————#}
{% extends 'bpm_master/bpm_sample.html' %}
{% load bpm_tags %}
{% block right-container-content %} {#自定义内容开始 右边页面内容#}
<div class="container col-lg-7 col-md-offset-2">
<div class="panel panel-warning">
<div class=" panel-heading">
<h3 class="panel-title container">报名入学|信息填写</h3>
</div>
<div class="panel-body "><!--返回提交函数-->
{## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#}
{% if status != 1 %}
<span class="errors">{{ customer_form.errors }}</span><!--错误提示-->
{## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#}
{## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#}
{# <form method="post" class="form-horizontal" role="form">{% csrf_token %}#}
<form method="post" class="form-horizontal" role="form"
onsubmit="return RegisterFormCheck()">{% csrf_token %}
{## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#}
{% for foo in customer_form %}
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">{{ foo.label }}</label>
<div class="col-sm-8">
{{ foo }}
</div>
</div>
{% endfor %}
<hr>
{#返回06学员报名信息表的数据#}
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">所报班级</label>
<div class="col-sm-8">
{{ enroll_obj.enrolled_class }}
</div>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">课程费用</label>
<div class="col-sm-8">
{{ enroll_obj.enrolled_class.course.price }}
</div>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">开课日期</label>
<div class="col-sm-8">
{{ enroll_obj.enrolled_class.start_date }}
</div>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">合同</label>
<div class="col-sm-10">
<div style="width: 550px">
<pre style="height: 300px">{% render_enrolled_contract enroll_obj %} </pre>
</div> </div>
</div>
<div class="form-group">
<div class="col-sm-12">
<input type="checkbox" value="{{ enroll_obj.contract_agreed }}" name="contract_agreed"
checked>
我已经认真阅读完协议并接受所有条款
</div>
</div>
<div class="text-center">
<input type="submit" class="btn btn-info" value="提交">
</div>
</form>
{## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#}
{% else %}
<h3>报名成功,同合进入审核流程,感谢您的选择!</h3>
{% endif %}
{## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#}
</div>
<div class="panel-footer">
<input type="button" class="btn btn-danger right" value="关闭" onclick="CloseWebPage()">
</div>
</div>
</div>
{% endblock %} {% block js %}
<script>
function CloseWebPage() {
if (confirm("您确定要关闭本页吗?")) {
window.opener = null;
window.open('', '_self');
window.close();
}
else {
}
} {## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#} function RegisterFormCheck() {
if ($('form :checkbox').prop("checked")) {
$("form").find("[disabled]").removeAttr("disabled");//移除不可修改 便于提交表单 #qq
return true;
} else {
alert('请认真阅读并且同意条款,才可以报名');
return false;
}
} {## ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————#} </script> {% endblock %}
{## ————————48PerfectCRM实现CRM客户报名流程学生合同————————#}
{#stu_registration.html#}
# forms.py
# ————————47PerfectCRM实现CRM客户报名流程————————
from crm import models #数据库
from django.forms import ModelForm #继承forms自定制
#报名 销售填写
class EnrollmentForm(ModelForm):
def __new__(cls, *args, **kwargs):
for field_name,field_obj in cls.base_fields.items():
field_obj.widget.attrs['class'] = 'form-control'## 前端的样式
return ModelForm.__new__(cls)
class Meta:
model= models.Enrollment
fields= ['enrolled_class']
# ————————47PerfectCRM实现CRM客户报名流程———————— # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
#报名学员填 写
class CustomerForm(ModelForm):
def __new__(cls, *args, **kwargs):
for field_name,field_obj in cls.base_fields.items():
field_obj.widget.attrs['class'] = 'form-control'## 前端的样式
if field_name in cls.Meta.readonly_fields:#如果不可修改
field_obj.widget.attrs['disabled'] = True## 前端的样式 灰色
return ModelForm.__new__(cls) # ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————
def clean_qq(self):
#print(self.instance.qq,self.cleaned_data['qq'],'9696969696')
if self.instance.qq != self.cleaned_data['qq']: #输入的值和 cleaned_data的值
self.add_error('qq',"大神,请勿非法修改!")
return self.cleaned_data['qq'] def clean_consultant(self):
if self.instance.consultant != self.cleaned_data['consultant']:
self.add_error('consultant',"非法修改!不要尝试!")
return self.cleaned_data['consultant'] def clean_source(self):
if self.instance.source != self.cleaned_data['source']:
self.add_error('source',"非法修改!不能通过!")
return self.cleaned_data['source']
# ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证———————— class Meta:
model=models.Customer#客户表
fields='__all__'
exclude=['tags','content','memo','status','referral_from','consult_courses']#排除,不显示
readonly_fields=['qq','consultant','source']#不可修改
# ————————48PerfectCRM实现CRM客户报名流程学生合同————————
# forms.py
http://127.0.0.1:8000/bpm/customer/registration/1/
Django项目:CRM(客户关系管理系统)--59--49PerfectCRM实现CRM客户报名流程学生合同表单验证的更多相关文章
- 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(客户关系管理系统)--78--68PerfectCRM实现CRM业务流程(bpm)报名缴费分页
# pagination.py # ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页———————— from django.utils.safestring impo ...
- Django项目:CRM(客户关系管理系统)--63--53PerfectCRM实现CRM客户报名流程缴费
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- Django项目:CRM(客户关系管理系统)--62--52PerfectCRM实现CRM客户报名流程学生合同审核
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- Django项目:CRM(客户关系管理系统)--61--51PerfectCRM实现CRM客户报名流程学生合同上传照片
# sales_views.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.db import IntegrityError # 主动 ...
- Django项目:CRM(客户关系管理系统)--60--50PerfectCRM实现CRM客户报名流程学生合同URL随机码
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- 文献综述二十:基于UML技术的客户关系管理系统实现
一.基本信息 标题:基于UML技术的客户关系管理系统实现 时间:2015 出版源:电子设计工程 文件分类:uml技术的研究 二.研究背景 设计出可应用与银行和储户之间沟通的客户关系管理系统,从而实现对 ...
- Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
随机推荐
- HashMap(常用)方法个人理解
Hashmap的存值: public static void main(String[] args) { ///*Integer*/map.put("1", 1);//向map ...
- 基于UDP协议的套接字编程
基于udp协议的套接字编程 UDP是无链接的,先启动那一端都不会报错 UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到 一般不用与传输大数据 虽然没有粘包问题,但是不能 ...
- Python 字符串_python 字符串截取_python 字符串替换_python 字符串连接
Python 字符串_python 字符串截取_python 字符串替换_python 字符串连接 字符串是Python中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符 ...
- JAVA判断一个对象生存还是死亡
JAVA中判断一个对象是否死亡的算法有两种: 引用计数算法 可达性分析算法 一.引用计数算法所谓引用计数算法就是,给一个对象定义一个引用计数器,每当该对象被引用一次引用计数器就加1,如果一个对象的引用 ...
- node-webkit笔记
两个月前给一个运营站点做了个封皮,今天再做竟然忘了怎么搞了...为之文以志. 流程参考: http://www.cnblogs.com/2050/p/3543011.html 相关命令: copy / ...
- Spring - JUnit整合测试
1.导包:test.jar - (依赖 aop.jar) 2.使用@RunWith注解创建spring容器 - @RunWith(SpringJUnit4ClassRunner.class) 3.使用 ...
- asp.net Core 获取应用程序所在目录的2种方式
//获取应用程序所在目录的2种方式(绝对,不受工作目录影响,建议采用此方法获取路径).如:d:\Users\xk\Desktop\WebApplication1\WebApplication1\bin ...
- wpf 获取image控件的图片并保存
XMAL代码如下: <Image Name="ImageToSave" Source="Images/pic_bg.png" Grid.RowSpan=& ...
- webpack用了manifest为何还是每次都生成新的vendor?
原来的代码 //用于提取公共代码 new webpack.optimize.CommonsChunkPlugin({ //记得要在开头引入webpack names: ['vendor','manif ...
- websocket 实现消息推送(转)
介绍 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器. ...