这个部分可以算是这个系统的难点部分了,主要涉及到了对多对多表格关系之间的操作
由于在前面我使用的是mangtomany的方式添加的多对多关系,在这个功能中,由于要涉及到分数,而分数和课程已经学生的关系甚至和课程的关系都是一对多,所以分数字段在学生与课程表的中间表,是最符合他们之间的关系。
但是由于使用manytomany的方法,无法直接对中间表进行操作,所以必须要从新定义这个中间表的model。但是这个时候再来从新定义一个相同的中间表会导致更改很多东西。所以为了我再次地应了一个新的中间表(score)
新的score表在每次选择或者取消课程的同时也进行一次相对应的操作
score表的建立方式, 由于前几次migrate出现了错误,导致我在migrate的时候出现了很多错误,所以在这里我还是直接使用Navicat进行表格的建立
create table score(
id int not null auto_increment,
course_id int default null,
stu_id int default null,
primary key(id),
foreign key(course_id) references course(id),
foreign key(stu_id) references student
)
虽然没有使用python manage.py makemigrations这些操作,model模型的定义还是不能少
class StuCourse(models.Model):
student = models.ForeignKey(Student)
course = models.ForeignKey(Course)
score = models.IntegerField(null=True, blank=True)
class Meta:
db_table = 'scores'
上面需要注意的是blank,null属性的区别,前者是在表单提交时是否可以为空,后者是数据库中是否可以为空,如果想要想创建学生id和课程id,再添加score,请一定要加上blank=True。否则后果自负。
def sure_scores(request):
if request.method == 'POST':
course_id = request.POST.get('course_id')
stu_id = request.POST.get('stu_id')
stu = Student.objects.get(pk=stu_id)
g_id = stu.g_id
course_id_score = request.POST.get('score_'+course_id)
stucourse = StuCourse.objects.get(course_id=course_id, student_id=stu_id)
stucourse.score = int(course_id_score)
stucourse.save()
return HttpResponseRedirect(reverse('course:currentgs', kwargs={'g_id': g_id}))
没有进行过多的页面渲染,这个页面是先通过选择班级,再跳转进入的,目前只有第一个学生进行了选课的操作,如图所示。
def select_scores(request):
if request.method == 'GET':
s_name = request.session['s_name']
stu = Student.objects.get(s_name=s_name)
stucourses = stu.stucourse_set.all()
return render(request, 'selscores.html', {'stucourses': stucourses, 'stu': stu})
查询方法是先找到对应id所有的stucourses, 通过单个stucourse.course的方法可以直接找到所对应的course对象,从而达到相识课程名的效果。到此,这个学生信息管理系统也就基本完成了。但是由于项目中,遇到的某些事,中间暂停了一段时间,最终的效果其实并没有完全达到我之前想要达到的效果。
目前未完成的功能:管理员登录功能、用户登录验证功能
这两个功能,我将在下一篇介绍MiddleWare中间件的时候,一起实现。