第10节、案例-客户关系管理系统之增删改查笔记
一、建立模型
1、导入模型
fromdjango.dbimportmodels
2、创建学生表
classStudent(models.Model):# 学生表
name=models.CharField(max_length=20)
age=models.SmallIntegerField()
sex=models.SmallIntegerField(default=1)
qq=models.CharField(max_length=20,unique=True)
phone=models.CharField(max_length=20,unique=True)
c_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
e_time=models.DateTimeField(verbose_name='修改时间',auto_now=True)
grade=models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True)
is_delete=models.BooleanField(default=False)# 一般实际开发过程中,我们不会直接删除数据,而是给数据加上is_delete字段,来标记数据的状态。
def__str__(self):
return'%s-%s-%s'%(self.name,self.age,self.sex)
3、创建学生详情表
classStudentDetail(models.Model):#学生详情表
num=models.CharField('身份证',max_length=40,unique=True)
college=models.CharField('毕业学校',max_length=20,default='')
student=models.OneToOneField('Student',on_delete=models.CASCADE,related_name='detail')
def__str__(self):
return'%s-%s'%(self.num,self.college)
4、创建班级表
classGrade(models.Model):# 班级表
name=models.CharField('班级名称',max_length=20)
num=models.CharField('班期',max_length=20)
def__str__(self):
return'%s-%s'%(self.name,self.num)
5、创建课程表
classCourse(models.Model):# 课程表
name=models.CharField('课程名称',max_length=20)
student=models.ManyToManyField('Student',through='Enroll')
def__str__(self):
return'%s'%self.name
6、创建学生表与课程表的中间表
classEnroll(models.Model):# 课程与学生多对多中间表
student=models.ForeignKey('Student',on_delete=models.CASCADE)
course=models.ForeignKey('Course',on_delete=models.CASCADE)
pay=models.FloatField('缴费金额',default=0)
c_time=models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
def__str__(self):
return'%s'%self.pay
##
二、增删改查功能实现
1、index页面视图函数
fromdjango.shortcutsimportrender,redirect,reverse
fromdjango.httpimportHttpResponse
fromstudent.modelsimportStudent,Grade,StudentDetail
fromdjango.db.modelsimportQ
fromdjango.core.paginatorimportPaginator
# Create your views here.
defindex(request):
section='学生列表'
search=request.POST.get('search','').strip()# 接收从html的form表单传过来的参数
ifsearch:
ifsearch.isdigit():# 如果是数值类型则
sts=Student.objects.filter(Q(qq=search)|Q(phone=search),is_delete=False)# 用qq和phone去匹配
else:# 如果是字符型
sts=Student.objects.filter(name=search,is_delete=False)# 则和名字匹配
else:# search都没有匹配到则查询所有学生
sts=Student.objects.filter(is_delete=False)
sts=sts.order_by('-c_time')# 排序
returnrender(request,'student/index.html',context={
'sts':sts,
'section':section,
'search':search,
})
2、学生删除页视图
defstudent_delete(request,pk):
student=Student.objects.get(pk=pk)# 查询id为pk的学生
student.is_delete=True# 将is_delete标记为True,
student.save()# 保存
returnredirect(reverse('student:index'))
3、学生详情页视图
defstudent_detail(request,pk):
section='学生详情'
grades=Grade.objects.all()# 查询所有班级
sts=Student.objects.get(pk=pk)# 获取当前id为pk的学生信息
grade=Grade.objects.get(pk=sts.grade_id)# 查询指定学生的班级
detail=StudentDetail.objects.get(student=sts)# 查询指定学生的详情
returnrender(request,'student/student_detail.html',context={
'section':section,
'grades':grades,
'sts':sts,
'grade':grade,
'detail':detail,
})
4、添加页视图函数
defstudent_add(request):
section='添加学生信息'
grades=Grade.objects.all()# 获取所有的班级
ifrequest.method=='GET':
returnrender(request,'student/student_detail.html',context={
'section':section,
'grades':grades,
})
ifrequest.method=='POST':
# 获取班级信息
grade_id=request.POST.get('grade')# 获取前端传回来的grade.id
try:
grade=Grade.objects.get(pk=grade_id)
except:
grade=None
# 获取学生信息姓名、年龄、性别、qq、电话
data= {
'name':request.POST.get('name'),
'age':request.POST.get('age'),
'sex':request.POST.get('sex'),
'qq':request.POST.get('qq'),
'phone':request.POST.get('phone'),
'grade':grade#表关联,在student中
}
student=Student.objects.create(**data)
# 获取学生详情信息
StudentDetail.objects.create(
num=request.POST.get('num'),
college=request.POST.get('college'),
student=student# 表关联
)
returnredirect(reverse('student:index'))
5、修改学生信息页视图函数
defstudent_edit(request,pk):
section='修改学生信息'
sts=Student.objects.get(pk=pk)# 查询id为pk的学生
grade=Grade.objects.get(pk=sts.grade_id)# 查询指定学生的班级
detail=StudentDetail.objects.get(student=sts)# 查询指定学生的详情
ifrequest.method=='GET':
returnrender(request,'student/student_detail.html',context={
'section':section,
'sts':sts,
'grade':grade,
'detail':detail,
})
ifrequest.method=='POST':
# 获取班级信息
grade_id=request.POST.get('grade')# 获取前端传回来的grade
try:
grade=Grade.objects.get(pk=grade_id)# 获取学生的班级
except:
grade=None
# 获取学生信息并修改
student=Student.objects.get(pk=pk)
student.name=request.POST.get('name')
student.age=request.POST.get('age')
student.sex=request.POST.get('sex')
student.qq=request.POST.get('qq')
student.phone=request.POST.get('phone')
student.grade=grade# 表关联
# 获取学生详情
try:
detail=student.detail# 表关联,关联表在student
except:
detail=StudentDetail()
detail.student=student# 表关联,关联表在detail
detail.num=request.POST.get('num')
detail.college=request.POST.get('college')
detail.save()# 保存
student.save()# 保存
returnredirect(reverse('student:index'))
三、分页功能实现
1、对主页分页方法一
1.1主页的视图函数
defindex(request):
section='学生列表'
search=request.POST.get('search','').strip()# 接收从html的form表单传过来的参数
ifsearch:
ifsearch.isdigit():# 如果是数值类型则
sts=Student.objects.filter(Q(qq=search)|Q(phone=search),is_delete=False)# 用qq和phone去匹配
else:# 如果是字符型
sts=Student.objects.filter(name=search,is_delete=False)# 则和名字匹配
else:# search都没有匹配到则查询所有学生
sts=Student.objects.filter(is_delete=False)
sts=sts.order_by('-c_time')# 排序
# 分页
total_num=sts.count()# 总的数据量
per_page=int(request.GET.get('per_page',5))# 每页默认条数为5
page=int(request.GET.get('page',1))# 当前页面默认为第1页
p=Paginator(sts,per_page,allow_empty_first_page=True)
sts=p.get_page(page)# 每页显示的数据
total_page=p.num_pages# 总的页面数
page_list=p.page_range# 获取页面范围
returnrender(request,'student/index.html',context={
'sts':sts,
'section':section,
'search':search,
'total_num':total_num,
'total_page':total_page,
'page':page,
'per_page':per_page,
'page_list':page_list,
})
1.2、html中页码的设置
{% for i in page_list %}
{% endfor %}
{{ per_page }}条/页