巨蟒django之CRM1 需求分析&&表结构设计&&注册登录验证
1.需求分析
.项目
()业务
()权限的管理
.CRM
customer relationship management 客户关系管理系统
.谁来使用CRM?
销售&&班主任&&讲师&&助教 .项目的需求分析
()注册
()登录
()销售
.客户信息管理
增加 编辑 展示 客户信息(删除一般不用它做,后台管理员来做,为了信息安全)
.跟进信息管理
增加 编辑 展示 跟进信息
.报名信息的管理
增加 编辑 展示 报名信息
.缴费记录的管理
增加 编辑 展示 缴费记录
()班主任(外键的关系)
.班级信息
增加 编辑 展示 班级信息
.课程信息
增加 编辑 展示 课程信息
什么时间上课?讲的是什么?
.上课(学习)信息
增加 编辑 展示 上课(学习)信息 CURD()
本周的主要内容,增删改查.
流程怎么样?梳理这个流程,记录这个步骤,做好记录和编辑 ()表结构
销售部分:
.用户表
.客户表
id name
洋洋
扬扬
.跟进记录
.报名记录
.缴费记录表
班级任:
.班级表(期数&&学科分开)
开班时间&&结束时间&&班主任是谁?
.课程记录表
第几天的课,记录详细信息,标题,讲师是谁,班主任是谁,是否有作业,今天上课的主要内容
id day_num
day64
day63
.学习记录表(和上边的客户表制作外键关系)
上的是哪节课,哪天的课
student_id class_id 出勤
旷课
旷课 注意:这里是某一个人记录信息,报某个班,时间,一行记录才能记录这个信息
谁交了钱,谁收了钱,什么钱?多少钱? 今天上午,我们需要做的事情是,设计表结构!!!! 设计到11点,写成类
要么再添加表&&关系&&属性
2.表结构设计
from django.db import models
from multiselectfield import MultiSelectField course_choices = (('Linux', 'Linux中高级'),
('PythonFullStack', 'Python高级全栈开发'),) class_type_choices = (('fulltime', '脱产班',),
('online', '网络班'),
('weekend', '周末班',),) source_type = (('qq', "qq群"),
('referral', "内部转介绍"),
('website', "官方网站"),
('baidu_ads', "百度推广"),
('office_direct', "直接上门"),
('WoM', "口碑"),
('public_class', "公开课"),
('website_luffy', "路飞官网"),
('others', "其它"),) enroll_status_choices = (('signed', "已报名"),
('unregistered', "未报名"),
('studying', '学习中'),
('paid_in_full', "学费已交齐")) seek_status_choices = (('A', '近期无报名计划'), ('B', '1个月内报名'), ('C', '2周内报名'), ('D', '1周内报名'),
('E', '定金'), ('F', '到班'), ('G', '全款'), ('H', '无效'),)
pay_type_choices = (('deposit', "订金/报名费"),
('tuition', "学费"),
('transfer', "转班"),
('dropout', "退学"),
('refund', "退款"),) attendance_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('absence', "缺勤"),
('leave_early', "早退"),) score_choices = ((100, 'A+'),
(90, 'A'),
(85, 'B+'),
(80, 'B'),
(70, 'B-'),
(60, 'C+'),
(50, 'C'),
(40, 'C-'),
(0, ' D'),
(-1, 'N/A'),
(-100, 'COPY'),
(-1000, 'FAIL'),) class Department(models.Model):
"""
部门表
"""
name = models.CharField(max_length=32, verbose_name="部门名称")
count = models.IntegerField(verbose_name="人数", default=0) class UserProfile(models.Model):
"""
用户表
"""
username = models.EmailField(max_length=255, unique=True, )
password = models.CharField(max_length=128)
name = models.CharField('名字', max_length=32)
department = models.ForeignKey('Department', default=None, blank=True, null=True)
mobile = models.CharField('手机', max_length=32, default=None, blank=True, null=True)
memo = models.TextField('备注', blank=True, null=True, default=None)
date_joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True) class Customer(models.Model):
"""
客户表
"""
qq = models.CharField('QQ', max_length=64, unique=True, help_text='QQ号必须唯一')
qq_name = models.CharField('QQ昵称', max_length=64, blank=True, null=True)
name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='学员报名后,请改为真实姓名')
sex_type = (('male', '男'), ('female', '女'))
sex = models.CharField("性别", choices=sex_type, max_length=16, default='male', blank=True, null=True)
birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
phone = models.BigIntegerField('手机号', blank=True, null=True)
source = models.CharField('客户来源', max_length=64, choices=source_type, default='qq')
introduce_from = models.ForeignKey('self', verbose_name="转介绍自学员", blank=True, null=True)
course = MultiSelectField("咨询课程", choices=course_choices)
class_type = models.CharField("班级类型", max_length=64, choices=class_type_choices, default='fulltime')
customer_note = models.TextField("客户备注", blank=True, null=True, )
status = models.CharField("状态", choices=enroll_status_choices, max_length=64, default="unregistered",
help_text="选择客户此时的状态")
last_consult_date = models.DateField("最后跟进日期", auto_now_add=True)
next_date = models.DateField("预计再次跟进时间", blank=True, null=True)
consultant = models.ForeignKey('UserProfile', verbose_name="销售", related_name='customers', blank=True, null=True, )
class_list = models.ManyToManyField('ClassList', verbose_name="已报班级", ) class Campuses(models.Model):
"""
校区表
"""
name = models.CharField(verbose_name='校区', max_length=64)
address = models.CharField(verbose_name='详细地址', max_length=512, blank=True, null=True) class ClassList(models.Model):
"""
班级表
"""
course = models.CharField("课程名称", max_length=64, choices=course_choices)
semester = models.IntegerField("学期")
campuses = models.ForeignKey('Campuses', verbose_name="校区")
price = models.IntegerField("学费", default=10000)
memo = models.CharField('说明', blank=True, null=True, max_length=100)
start_date = models.DateField("开班日期")
graduate_date = models.DateField("结业日期", blank=True, null=True)
teachers = models.ManyToManyField('UserProfile', verbose_name="老师")
class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name='班额及类型', blank=True,
null=True) class Meta:
unique_together = ("course", "semester", 'campuses') class ConsultRecord(models.Model):
"""
跟进记录表
"""
customer = models.ForeignKey('Customer', verbose_name="所咨询客户")
note = models.TextField(verbose_name="跟进内容...")
status = models.CharField("跟进状态", max_length=8, choices=seek_status_choices, help_text="选择客户此时的状态")
consultant = models.ForeignKey("UserProfile", verbose_name="跟进人", related_name='records')
date = models.DateTimeField("跟进日期", auto_now_add=True)
delete_status = models.BooleanField(verbose_name='删除状态', default=False) class Enrollment(models.Model):
"""
报名表
""" why_us = models.TextField("为什么报名", max_length=1024, default=None, blank=True, null=True)
your_expectation = models.TextField("学完想达到的具体期望", max_length=1024, blank=True, null=True)
contract_agreed = models.BooleanField("我已认真阅读完培训协议并同意全部协议内容", default=False)
contract_approved = models.BooleanField("审批通过", help_text="在审阅完学员的资料无误后勾选此项,合同即生效", default=False)
enrolled_date = models.DateTimeField(auto_now_add=True, verbose_name="报名日期")
memo = models.TextField('备注', blank=True, null=True)
delete_status = models.BooleanField(verbose_name='删除状态', default=False)
customer = models.ForeignKey('Customer', verbose_name='客户名称')
school = models.ForeignKey('Campuses')
enrolment_class = models.ForeignKey("ClassList", verbose_name="所报班级") class Meta:
unique_together = ('enrolment_class', 'customer') class PaymentRecord(models.Model):
"""
缴费记录表
"""
pay_type = models.CharField("费用类型", choices=pay_type_choices, max_length=64, default="deposit")
paid_fee = models.IntegerField("费用数额", default=0)
note = models.TextField("备注", blank=True, null=True)
date = models.DateTimeField("交款日期", auto_now_add=True)
course = models.CharField("课程名", choices=course_choices, max_length=64, blank=True, null=True, default='N/A')
class_type = models.CharField("班级类型", choices=class_type_choices, max_length=64, blank=True, null=True,
default='N/A')
enrolment_class = models.ForeignKey('ClassList', verbose_name='所报班级', blank=True, null=True)
customer = models.ForeignKey('Customer', verbose_name="客户")
consultant = models.ForeignKey('UserProfile', verbose_name="销售")
delete_status = models.BooleanField(verbose_name='删除状态', default=False) status_choices = (
(1, '未审核'),
(2, '已审核'),
)
status = models.IntegerField(verbose_name='审核', default=1, choices=status_choices) confirm_date = models.DateTimeField(verbose_name="确认日期", null=True, blank=True)
confirm_user = models.ForeignKey(verbose_name="确认人", to='UserProfile', related_name='confirms', null=True,
blank=True) class CourseRecord(models.Model):
"""课程记录表"""
day_num = models.IntegerField("节次", help_text="此处填写第几节课或第几天课程...,必须为数字")
date = models.DateField(auto_now_add=True, verbose_name="上课日期")
course_title = models.CharField('本节课程标题', max_length=64, blank=True, null=True)
course_memo = models.TextField('本节课程内容', max_length=300, blank=True, null=True)
has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
homework_title = models.CharField('本节作业标题', max_length=64, blank=True, null=True)
homework_memo = models.TextField('作业描述', max_length=500, blank=True, null=True)
scoring_point = models.TextField('得分点', max_length=300, blank=True, null=True)
re_class = models.ForeignKey('ClassList', verbose_name="班级")
teacher = models.ForeignKey('UserProfile', verbose_name="班主任") class Meta:
unique_together = ('re_class', 'day_num') class StudyRecord(models.Model):
"""
学习记录
""" attendance = models.CharField("考勤", choices=attendance_choices, default="checked", max_length=64)
score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
homework_note = models.CharField(max_length=255, verbose_name='作业批语', blank=True, null=True)
date = models.DateTimeField(auto_now_add=True)
note = models.CharField("备注", max_length=255, blank=True, null=True)
homework = models.FileField(verbose_name='作业文件', blank=True, null=True, default=None)
course_record = models.ForeignKey('CourseRecord', verbose_name="某节课程")
student = models.ForeignKey('Customer', verbose_name="学员") class Meta:
unique_together = ('course_record', 'student')
3.注册登录验证
(1)新建项目
(2)配置信息
中间件我们不需要再注释了
一些介绍:
从源码中查看源码,从全局配置global_settings.py中拿到,放到settings.py
全局变量中的,全部session配置
模板配置:
DATABASES配置之前,我们先创建数据库
因为已经存在crm数据库,所以不能创建,我们需要在创建一个crm1的数据库.
下面我们在settings.py里边,配置mysql引擎.
在项目的目录下的__init__.py,也就是settings.py同级目录下,
导入:
将创建好的表结构,放到models.py里边
详细表设计代码:
from django.db import models
from multiselectfield import MultiSelectField course_choices = (('Linux', 'Linux中高级'),
('PythonFullStack', 'Python高级全栈开发'),) class_type_choices = (('fulltime', '脱产班',),
('online', '网络班'),
('weekend', '周末班',),) source_type = (('qq', "qq群"),
('referral', "内部转介绍"),
('website', "官方网站"),
('baidu_ads', "百度推广"),
('office_direct', "直接上门"),
('WoM', "口碑"),
('public_class', "公开课"),
('website_luffy', "路飞官网"),
('others', "其它"),) enroll_status_choices = (('signed', "已报名"),
('unregistered', "未报名"),
('studying', '学习中'),
('paid_in_full', "学费已交齐")) seek_status_choices = (('A', '近期无报名计划'), ('B', '1个月内报名'), ('C', '2周内报名'), ('D', '1周内报名'),
('E', '定金'), ('F', '到班'), ('G', '全款'), ('H', '无效'),)
pay_type_choices = (('deposit', "订金/报名费"),
('tuition', "学费"),
('transfer', "转班"),
('dropout', "退学"),
('refund', "退款"),) attendance_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('absence', "缺勤"),
('leave_early', "早退"),) score_choices = ((100, 'A+'),
(90, 'A'),
(85, 'B+'),
(80, 'B'),
(70, 'B-'),
(60, 'C+'),
(50, 'C'),
(40, 'C-'),
(0, ' D'),
(-1, 'N/A'),
(-100, 'COPY'),
(-1000, 'FAIL'),) class Department(models.Model):
"""
部门表
"""
name = models.CharField(max_length=32, verbose_name="部门名称")
count = models.IntegerField(verbose_name="人数", default=0) class UserProfile(models.Model):
"""
用户表
"""
username = models.EmailField(max_length=255, unique=True, )
password = models.CharField(max_length=128)
name = models.CharField('名字', max_length=32)
department = models.ForeignKey('Department', default=None, blank=True, null=True)
mobile = models.CharField('手机', max_length=32, default=None, blank=True, null=True)
memo = models.TextField('备注', blank=True, null=True, default=None)
date_joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True) class Customer(models.Model):
"""
客户表
"""
qq = models.CharField('QQ', max_length=64, unique=True, help_text='QQ号必须唯一')
qq_name = models.CharField('QQ昵称', max_length=64, blank=True, null=True)
name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='学员报名后,请改为真实姓名')
sex_type = (('male', '男'), ('female', '女'))
sex = models.CharField("性别", choices=sex_type, max_length=16, default='male', blank=True, null=True)
birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
phone = models.BigIntegerField('手机号', blank=True, null=True)
source = models.CharField('客户来源', max_length=64, choices=source_type, default='qq')
introduce_from = models.ForeignKey('self', verbose_name="转介绍自学员", blank=True, null=True)
course = MultiSelectField("咨询课程", choices=course_choices)
class_type = models.CharField("班级类型", max_length=64, choices=class_type_choices, default='fulltime')
customer_note = models.TextField("客户备注", blank=True, null=True, )
status = models.CharField("状态", choices=enroll_status_choices, max_length=64, default="unregistered",
help_text="选择客户此时的状态")
last_consult_date = models.DateField("最后跟进日期", auto_now_add=True)
next_date = models.DateField("预计再次跟进时间", blank=True, null=True)
consultant = models.ForeignKey('UserProfile', verbose_name="销售", related_name='customers', blank=True, null=True, )
class_list = models.ManyToManyField('ClassList', verbose_name="已报班级", ) class Campuses(models.Model):
"""
校区表
"""
name = models.CharField(verbose_name='校区', max_length=64)
address = models.CharField(verbose_name='详细地址', max_length=512, blank=True, null=True) class ClassList(models.Model):
"""
班级表
"""
course = models.CharField("课程名称", max_length=64, choices=course_choices)
semester = models.IntegerField("学期")
campuses = models.ForeignKey('Campuses', verbose_name="校区")
price = models.IntegerField("学费", default=10000)
memo = models.CharField('说明', blank=True, null=True, max_length=100)
start_date = models.DateField("开班日期")
graduate_date = models.DateField("结业日期", blank=True, null=True)
teachers = models.ManyToManyField('UserProfile', verbose_name="老师")
class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name='班额及类型', blank=True,
null=True) class Meta:
unique_together = ("course", "semester", 'campuses') class ConsultRecord(models.Model):
"""
跟进记录表
"""
customer = models.ForeignKey('Customer', verbose_name="所咨询客户")
note = models.TextField(verbose_name="跟进内容...")
status = models.CharField("跟进状态", max_length=8, choices=seek_status_choices, help_text="选择客户此时的状态")
consultant = models.ForeignKey("UserProfile", verbose_name="跟进人", related_name='records')
date = models.DateTimeField("跟进日期", auto_now_add=True)
delete_status = models.BooleanField(verbose_name='删除状态', default=False) class Enrollment(models.Model):
"""
报名表
""" why_us = models.TextField("为什么报名", max_length=1024, default=None, blank=True, null=True)
your_expectation = models.TextField("学完想达到的具体期望", max_length=1024, blank=True, null=True)
contract_agreed = models.BooleanField("我已认真阅读完培训协议并同意全部协议内容", default=False)
contract_approved = models.BooleanField("审批通过", help_text="在审阅完学员的资料无误后勾选此项,合同即生效", default=False)
enrolled_date = models.DateTimeField(auto_now_add=True, verbose_name="报名日期")
memo = models.TextField('备注', blank=True, null=True)
delete_status = models.BooleanField(verbose_name='删除状态', default=False)
customer = models.ForeignKey('Customer', verbose_name='客户名称')
school = models.ForeignKey('Campuses')
enrolment_class = models.ForeignKey("ClassList", verbose_name="所报班级") class Meta:
unique_together = ('enrolment_class', 'customer') class PaymentRecord(models.Model):
"""
缴费记录表
"""
pay_type = models.CharField("费用类型", choices=pay_type_choices, max_length=64, default="deposit")
paid_fee = models.IntegerField("费用数额", default=0)
note = models.TextField("备注", blank=True, null=True)
date = models.DateTimeField("交款日期", auto_now_add=True)
course = models.CharField("课程名", choices=course_choices, max_length=64, blank=True, null=True, default='N/A')
class_type = models.CharField("班级类型", choices=class_type_choices, max_length=64, blank=True, null=True,
default='N/A')
enrolment_class = models.ForeignKey('ClassList', verbose_name='所报班级', blank=True, null=True)
customer = models.ForeignKey('Customer', verbose_name="客户")
consultant = models.ForeignKey('UserProfile', verbose_name="销售")
delete_status = models.BooleanField(verbose_name='删除状态', default=False) status_choices = (
(1, '未审核'),
(2, '已审核'),
)
status = models.IntegerField(verbose_name='审核', default=1, choices=status_choices) confirm_date = models.DateTimeField(verbose_name="确认日期", null=True, blank=True)
confirm_user = models.ForeignKey(verbose_name="确认人", to='UserProfile', related_name='confirms', null=True,
blank=True) class CourseRecord(models.Model):
"""课程记录表"""
day_num = models.IntegerField("节次", help_text="此处填写第几节课或第几天课程...,必须为数字")
date = models.DateField(auto_now_add=True, verbose_name="上课日期")
course_title = models.CharField('本节课程标题', max_length=64, blank=True, null=True)
course_memo = models.TextField('本节课程内容', max_length=300, blank=True, null=True)
has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
homework_title = models.CharField('本节作业标题', max_length=64, blank=True, null=True)
homework_memo = models.TextField('作业描述', max_length=500, blank=True, null=True)
scoring_point = models.TextField('得分点', max_length=300, blank=True, null=True)
re_class = models.ForeignKey('ClassList', verbose_name="班级")
teacher = models.ForeignKey('UserProfile', verbose_name="班主任") class Meta:
unique_together = ('re_class', 'day_num') class StudyRecord(models.Model):
"""
学习记录
""" attendance = models.CharField("考勤", choices=attendance_choices, default="checked", max_length=64)
score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
homework_note = models.CharField(max_length=255, verbose_name='作业批语', blank=True, null=True)
date = models.DateTimeField(auto_now_add=True)
note = models.CharField("备注", max_length=255, blank=True, null=True)
homework = models.FileField(verbose_name='作业文件', blank=True, null=True, default=None)
course_record = models.ForeignKey('CourseRecord', verbose_name="某节课程")
student = models.ForeignKey('Customer', verbose_name="学员") class Meta:
unique_together = ('course_record', 'student')
models.py
下边还有一些,在这里不全写出来了
上边有报错,在这里我们导入
这个时候,已经不再报错了
学习的两个方法接口:
执行两个命令:
连接左侧的数据库
上边报错的原因是,下面的这个图里边的配置里边的数据库名称没有修改,我已经修改过来了
还需要删除这个生成的内容
右下角会有一些信息,正在加载,注意这一点,加载完成才会出现
再次运行上边的两条命令
重新连接数据库
首先写登录,从url开始写
我们可以做路由分发,将项目主体,复制一份urls.py到app也就是crm里边.
app下的路由分发,写一个登录页面
下面开始写视图函数:
在模板里边写登录页面
jquery有一个插件库,寻找自己需要的样式
搜索"登录"界面,
最后一页的这个图:
点击,查看演示
右键,点击"检查"
一直出问题,
注意,需要X掉,右上角的叉号
页面跳转
右击,检查
复制,下面的body代码
<body>
<div class="login-container">
<h1>ShareLink</h1>
<div class="connect">
<p style="left: 0%;">Link the world. Share to world.</p>
</div>
<form action="" method="post" id="loginForm" novalidate="novalidate">
<div>
<input type="text" name="username" class="username" placeholder="用户名" autocomplete="off" value="admin">
</div>
<div>
<input type="password" name="password" class="password" placeholder="密码" oncontextmenu="return false" onpaste="return false">
</div>
<button id="submit" type="submit">登 陆</button>
</form>
<a href="register.html">
<button type="button" class="register-tis">还有没有账号?</button>
</a>
</div> <script src="http://www.jq22.com/jquery/1.11.1/jquery.min.js"></script><script src="https://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
<script src="js/common.js"></script> <script src="js/supersized.3.2.7.min.js"></script>
<script src="js/supersized-init.js"></script> <script src="js/jquery.validate.min.js?var1.14.0"></script>
<ul id="supersized" class="quality" style="visibility: visible;"><li class="slide-0" style="visibility: visible; opacity: 1;"><a target="_blank"><img src="./images/1.jpg" style="width: 1135px; left: 0px; top: -252.5px; height: 703.7px;"></a></li><li class="slide-1 prevslide" style="visibility: visible; opacity: 1;"><a target="_blank"><img src="./images/2.jpg" style="width: 1135px; left: 0px; top: -297.5px; height: 794.5px;"></a></li><li class="slide-2 activeslide" style="visibility: visible; opacity: 1;"><a target="_blank"><img src="./images/3.jpg" style="width: 1135px; height: 715.05px; left: 0px; top: -258px;"></a></li></ul></body>
直接放在login.html放在body替换一下
运行项目,注意这个地方,我们做了路由分发,所以这里输入地址,会发生一些变化,结果如下图
点击Source,所有加载的文件都在这个地方
css样式可以直接右击保存,style.css
图片可以通过在新的页面中打开,然后保存
其实,这个另存为的过程也是,下载到本地的过程
js文件直接右击保存就可以了,将static放在整个项目下,
先加入下面一点样式,看一下结果:
下面我们开始,处理动态背景
注意,这个静态路径的配置要写正确
这是,我们得到如下界面
现在,我们需要修改网络地址,修改成本地地址
注意,要在form表单中加上csrf_token
在复制的页面中依次寻找样式:
最后在js文件夹下的supersized-init.js中寻找到了
我们对这一行代码,进行格式化一下
因为是js文件,在这里只能够写死这个文件
一直没有找到解决这个问题
最后发现,前端这个引入,还是有影响的
这时候我们在后端打印一下,看一下结果
然后,点击"登录"
服务端显示的结果:
csrf_token不要忘记添加到form表单中
现在,我们需要判断请求方式:
点击UserProfile查看一下这个用户表
我们需要让这个用户表的is_active为True的情况下,才能够登录,也就是下面的写法
上边查询出的结果是queryset类型的数据,我们就查询第一个结果,查不出来就是个None
下面我们写一个主页面:
再写一个函数
因为,现在后端数据库中没有,信息,所以我们点击登录,得到的结果是这个
这样就写完了登录的样式
下面是注册用户,也就是"用户表"
用Form组件的升级版,Model.form
首先,在app下的urls.py下写注册(register)页面的路由
点击view,进入views.py页面,开始写views函数
在bootstrap里边找一个表单
放入注册界面的body里边
<form class="form-horizontal">
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">Email</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="inputEmail3" placeholder="Email">
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword3" placeholder="Password">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox"> Remember me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">Sign in</button>
</div>
</div>
</form>
创建一个plugins,在static文件夹下,将bootstrap放到插件plugins文件夹下边
运行:
代码优点难看,修改一下
第一步:
结果:
向下移动80px
修改之后的代码
造app里边新建一个froms.py文件
这里的CharField和models里边的不是一个东西.
对比一下用户表
稍微麻烦,如果用上边的Form,下面我们用ModelForm
用Meta:也就是元类处理这个问题,生成这些框
首先导入Form
下面是传入这个实例化的对象
得到结果:
运行:
运行:
对应得到的结果是:(需要再次理解这个地方)
我们拿第一个就可以了
运行:
得到结果:
运行,得到的结果:
第二种修改名字的方法:
verbose_name
运行,不用重启,或者制作模型
思考:下边这些能写汉字的原因?
进入charfield的源码
注意这个ForeignKey的第一个参数是to,还有ManytoMany也是这个to
两种方式等于中文名字
下面我们用插件widgets进行指定一下
也可以加一些额外的参数
下面我们去掉下面第32行的内容
修改对应的字典就可以进行响应的属性修改
密码需要密文进行修改:
原来的结果是直接显示出来,现在我们密文的显示效果见第二张图
再根据前端渲染添加的第三个字段name
再添加一个手机号&部门
运行结果:
如何一次性修改成上边的默认值?
通过默认值的初始化操作
点击进入:
下面我们开始写代码:
运行:回车
结果:
得到有序字典:键和值,键是字符串,值是对象
对象的对应:
我们通过for循环进行赋值,字典有一个update方法进行更新
两种for循环改值,通过字典
运行:
对密码进行验证
开始指定参数
运行,这样就写不下去了,通过前端进行校验
通过前端进行验证加上 novalidate,不校验就能提交
没有加上这个字段之前的结果:点击提交之后显示(这是前端进行校验的效果)
加上之后的效果,成功提交
注意到,上边的密码变成了英文,怎么修改??
这样我们显示的字段就足够用了
在前端再加上两个字段
后端需要判断请求方式
后端需要判断请求方式
原来的代码:
改进之后的代码:
随便填写,得到的结果:
点击注册:
得到结果,如下所示:
服务端得到的结果是queryset类型的
点击注册,服务端得到的结果:
创建数据,在数据表中
点击,注册
成功插入表中
新的插入方法:,额外多的字段,它也不看
成功添加进去
问题,我们需要加上密码的校验规则(也就是第一次和第二次密码一致),数据库中的password,需要用密文
下面开始写全局钩子,拿密码进行验证
上边密码,第一个输入123456,第二个输入1234567
点击注册
点击注册,得到结果:
在这里,我们看一下打印的结果:
两次密码,都输入123456,得到的结果
记忆密文的保存,前三句是加密,cleaned_data是加密之后存储数据的方式
删除原来的数据库里边的两条数据
删除数据,先用减号,然后用,上传
登录也需要修改
如果是登录不修改,即使写对了,也会验证不正确
也就是说,向数据库存储之前,需要加一次密文
注册,成功之后需要跳转到相应的登录页面
输入登录页面
输入:xiaoying@qq.com和密码123456,显示下图
问题在哪个地方
原因,相当于最后存储的is_active是0,也就是froms里边把它排除了
,下面我们对其进行修改
__all__相当于是拿到所有字段,相当于网数据库存的是None
重新注册(密码:123456)
注册,跳转到系列界面
输入密码和用户名
得到结果
字符串相等就有下面的对应方法了
密码是654321
跳转到这个界面:
点击登录,得到下图这个界面
巨蟒django之CRM1 需求分析&&表结构设计&&注册登录验证的更多相关文章
- node.js+mysql用户的注册登录验证
下面代码实现的功能是:用node.js连接mysql实现用户的注册和登录,这里主要实现的是后端的验证代码,前端显示部分没具体写出. 整个程序的流程是这样的: 1.首先建立数据库reji,数据表user ...
- django系列8.3.2--django中间件实现登录验证(2) 个人构想逻辑
middleware.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import rend ...
- 巨蟒django之权限6: 权限控制表设计&&登录权限
1.权限控制表设计 内容 . 什么是权限? . 为什么要有权限? 不同用户拥有不同的功能 . 在web开发中,什么是权限? url 代表 权限 . 开发一个权限的组件,为什么要开发组件? . 表结构的 ...
- 3.django笔记之form表单
作者:刘耀 瞎copy伸手党 我在诅咒你. Django的form的作用: 1.生成html标签 2.用来做用户提交的验证 3.可以和models一起使用(modelform) 一.form基础 工程 ...
- Django学习笔记之表单验证
表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...
- Django组件之Form表单
一.Django中的Form表单介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入 ...
- CMDB资产管理系统开发【day25】:表结构设计2
表结构设计1详细注释代码 # _*_coding:utf-8_*_ __author__ = 'luoahong' from assets.myauth import UserProfile from ...
- mysql 用户表结构设计,第三方登录
说起用户表,大概是每个应用/网站立项动工(码农们)考虑的第一件事情.用户表结构的设计,算是整个后台架构的基石.如果基石不稳,待到后面需求跟进了发现不能应付,回过头来反复修改用户表,要大大小小作改动的地 ...
- 巨蟒django之权限7:动态生成一级&&二级菜单
内容回顾: . 权限的控制 . 表结构设计 存权限的信息 用户表 - name 用户名 - pwd 密码 - roles 多对多 角色表 - name - permissions 多对多 权限表 - ...
随机推荐
- HTTP——HTTP 1.1的详细介绍 Gunicorn不支持HTTP 1.1
从前面一小节的表格里,我们可以看到,Gunicorn 的一个缺点是不支持HTTP 1.1.那么 HTTP 1.1 究竟是怎么一回事呢?我们选择 HTTP 服务器在什么情况下需要考虑对 HTTP 1.1 ...
- ngnix学习视频
https://www.bilibili.com/video/av36019080/?p=1
- JSON字符串化
1.JSON字符串化 JSON字符串化有2个可选参数,分别是replacer和space. 第一个可选参数replacer,它可以是数组或者函数.用来指定哪些属性被处理,哪些属性被排除. 第二个可选参 ...
- ROS示例----导航功能包Husky_exploration
ROS导航功能包示例husky amcl gmapping slam exploration 此功能包包含如下文件: 结构如下: $ tree -L 2 . ├── CMakeLists.txt -& ...
- activiti designer下载地址
http://www.activiti.org/designer/update/ http://www.activiti.org/designer/archived/ 这个地址貌似不能用了 ...
- 10、驱动中的阻塞与非阻塞IO
阻塞,就是在获取资源的时候,不能获取到,那么就会将当前的进程挂起(睡眠,也就是将当前进程从调度器拿走了,不会调度当前进程),直到满足条件为止再进行操作.相反,非阻塞,就是即使不能获取到资源,非 ...
- 第四天 ThinkPHP手把手高速拼接站点(四)
6月6日,晴天."熟梅天气豆生蛾.一见榴花感慨多. 芒种积阴凝雨润,菖蒲修剪莫蹉跎. " 九.后台编写-续-1 1.改动admin/Tpl/Login/index.html 自己改 ...
- Leetcode--easy系列3
#26 Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such th ...
- android.app.Service-android:process=":remote"属性解说
在学习Android Service组件的过程中碰到了一个问题,就是在Android应用的声明文件Manifest.xml中有时候会对相关的服务标签设置一个android:process=”:remo ...
- MySQL 汉字转拼音
一 . fristPinyin : 此函数是将一个中文字符串的第一个汉字转成拼音字母 (例如:"中国人"->Z) )) ) CHARSET utf8 BEGIN ); )), ...