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 ...
随机推荐
- HUD1686-Oulipo-kmp模板题/哈希模板题
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
- Java之RabbitMQ(二)多mq配置
场景: springboot单项目,自身使用mq中间件处理一些业务需求,某些业务上又需要消费第三方mq消息,这时候需要我们单项目中配置多套mq,这时候,需要我们自定义多套mq相关连接工厂.模板.监听工 ...
- <每日一题>题目1:简单的注册和登录1.0
#版本1.0,最基本的注册登录'''1.注册,将账号和密码分别写在不同的文档里面2.登录,分别从账户文档和密码文档进行读取并登录''' #注册 Identity = input("请输入您想 ...
- Redis理解和使用
摘抄并用于自查笔记 1. Redis简介 我们日常Java Web开发,一般使用数据库进行存储,在数据量较大的情况下,单一使用数据库保存数据的系统会因为面向磁盘,磁盘读写速度比较慢而存在严重的性能弊端 ...
- 04.Mybatis输出映射之ResultMap
当实体类中的字段名与数据库中的字段名不一致时需要手动设置映射关系 在Mapper.xml中定义 <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo ...
- 小米手机 DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
手机:小米2s,MIUI 9 7.11.16 开发版 手机已处于开发者模式,启用了USB调试,已使用USB线连接了手机,在Android Studio 工具栏点击 "Run ‘app’(Sh ...
- shell脚本使用需要注意的地方
shell脚本中,函数内部定义变量可以为局部变量和全局变量,局部变量使用local定义,全局变量不带local,全局变量可以在函数外部可见,如下: #!/bin/bash function calle ...
- [转]关于 MVVMLight 设计模式系列
关于 MVVMLight 设计模式系列 http://www.wxzzz.com/958.html MvvmLight框架使用入门 http://www.cnblogs.com/manupstairs ...
- scoreboarding
Reference docs: https://en.wikipedia.org/wiki/Scoreboarding SSC_course_5_Scoreboard_ex.pdf 1, what i ...
- 【JZOJ2679】跨时代
description 钟逆时针而绕,恶物狰狞的倾巢,我谦卑安静地于城堡下的晚祷,压抑远古流窜的蛮荒暗号,而管风琴键高傲的说,那只是在徒劳.我的乐器在环绕,时代无法淘汰我霸气的皇朝. 你无法预言,因为 ...