我们先在app01下的models中添加crm需要用的表。然后数据库迁移,要记得在app01下 的stark将这几张表注册,不然不能进入访问后台。
录入数据之前,我们先来说几个知识点,
在models表中,有这样几个字段,
一对多字段和多对多字段在使用modelform的时候,会在页面上渲染成select标签,而select标签会显示各自关联表下的所有数据,而 limit_choices_to={"depart_id__in":[100,101,]} 的作用就是限制选项,只显示{"depart_id__in":[100,101,]} 符合条件的选项。所以 limit_choices_to只有在使用modelform中使用。
还有一个知识点:get_gender_display()
在 性别字段中,choices选项在数据库中存的是1,2.
但是我们需要显示的是男,女,就要用到get_gender_display()。
然后录入数据,先录入department表的数据,然后录入userinfo表的数据。
然后我们访问classlist表,添加一些自定义的字段:
同理在其他表中也添加一些我们想要的字段,
然后我们想在customer表中,显示性别,我们在list_display中加上gender这个字段,但是显示出来的是1 ,2,这个1,2是保存在数据库中的值,并不是我们想要的 。
这是因为,model中的gender字段
,所以这就要我们通过自定义列来显示性别。
然后我们想在customer表中添加一列,咨询课程,以a标签的形式显示,同样是自定义列:
我们进入classstudyrecord表,现在有这样一个需求,就是在我们选中某个班时,就能够创建出这个班的学生学习相关信息。这就是一个批量操作。
现在我们在classstudyrecord表中建一个自定义列,查看信息,当我们点击查看信息的时候,就跳转到相应的studentstudyrecord表中查看信息,
我们进入StudentStudyRecord表,想要显示出勤和成绩的列还是要通过自定义列来显示自己想要的,
这样写应该是不对的因为当我们访问这张表的时候,出勤和成绩是我们可以操作进行选择的,有两种方式,一种是批量操作,就是选中之后,批量对他们进行赋值,另一种是做成select标签的形式每一个都能进行选择。
我们先来写第一种:
第二种,
这就select标签就做成了,但是这样只实现了在页面中可以编辑 ,但是在数据库中并没有改动。接下来应该怎么做?
有两个思路:
第一种是我们选中完出情况后,点击保存按钮然后保存到数据库中,另一种是当我们选中完一个就发送ajax请求将他保存到数据库中。这里发送ajax请求比较简单。
先来说发送ajax请求,我们发送ajax请求时的那个url怎么设计呢?当我们选中某个学生的出勤情况后向这个url发送请求 /stark/app01/studentstudyrecord/1/edit_record , 这是我们设计的一个新的url,我们只希望给studentstudyrecord表加这么一个url,别的表不加,应该怎么做。我们来学习一个额外创建url的方法。
我们在stark组件的sites文件中加上这么一个方法。
然后我们再自定义配置类中添加extra_url方法:
这样就单独给studentstudyrecord表添加了一个url。然后就是给出勤绑定ajax请求了,当我们鼠标选中的时候就在数据库中做更改操作,这是一个change事件。
那么这个ajax应该写在哪里?应该写在list.html中。
在数据库的更改操作:
另外一种方法我们在录入成绩的时候说。
接下来我们写录入成绩部分:
进入classstudyrecor表,我们要写一个录入成绩的自定义列,
现在我们的需求是,当我们点击录入成绩,就能够进入相应的班级的学生学习记录进行录入成绩。
这就要我们有新的url了。我们想要把url设计成这样:/stark/app01/classstudyrecord/1/record_score/,所以这就又要我们创建新的url了,所以在classstudyrecord表中添加方法,
接下来我们就来处理页面了,先来想一想页面中要显示哪些内容?
接下来就是成绩的录入了,同样使用两种方式,一种是ajax,一种就是form进行提交。
第一种:ajax
第二种:from表单 ,利用form表单,标签中就要有name。
当我们点击提交的时候,request.post会取nam对应的value值,
但是这样会影响效率,因为每循环一次都要去数据库里面查一次,所以我们需要重新构建一下数据的结构。
我们把数据构建成这样的,update数据库的时候,直接更新 {score:50,homework_note:12323} 多个字段就行了。
这样就做好了。
上面说的这些都是我们管理员才有的权限,学生是没有的,但当我们学生查看成绩的时候,我们在student表中添加一个自定义列。
我们进入学生表,
然后就是当我们点击查看成绩的时候,会出现这人的在这个班的每天的成绩情况,我们以柱状图的形式展现出来。这里用到了一个highcharts的工具,是专门用来作图的。
先下载,然后只需要将里面的code文件复制过来就行,然后再页面上引用。
当我们点击查看成绩的时候,发送ajax请求:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css"> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-success"> <div class="panel-heading"> <h3 class="panel-title" style="font-weight: bolder">{{ student_obj }}个人信息</h3> </div> <div class="panel-body"></div> <table class="table table-hover"> <thead> <tr> <th>序号</th> <th>班级名称</th> <th>任课老师</th> <th>班主任</th> <th>查看成绩</th> </tr> </thead> <tbody> {% for clas in class_list %} <tr> <th scope="row">{{ forloop.counter }}</th> <td>{{ clas }}</td> <td>{{ clas.tutor }}</td> {% for teacher in clas.teachers.all %} <td>{{ teacher }}</td> {% endfor %} <td><a sid=‘{{ student_obj.pk }}‘cid="{{ clas.pk }}" href="javascript:void(0)" class="score_chart">查看成绩</a></td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </div> </div> <div class="col-md-4 col-md-offset-4" id="score_chart" style="width:600px;height:400px;"></div> <script src="/static/code/highcharts.js"></script> <script> $(‘.score_chart‘).click(function () { var cid = $(this).attr(‘cid‘); $.ajax({ url:‘‘, type:‘get‘, data:{ cid:cid, }, success:function (data) { var chart = Highcharts.chart(‘score_chart‘, { chart: { type: ‘column‘ }, title: { text: ‘成绩‘ }, xAxis: { type: ‘category‘, labels: { rotation: -45 // 设置轴标签旋转角度 } }, yAxis: { min: 0, title: { text: ‘总分‘ } }, legend: { enabled: false }, tooltip: { pointFormat: ‘当天分数: <b>{point.y:.1f}分</b>‘ }, series: [{ name: ‘总人口‘, data:data, dataLabels: { enabled: true, rotation: -90, color: ‘#FFFFFF‘, align: ‘right‘, format: ‘{point.y:.1f}‘, // :.1f 为保留 1 位小数 y: 10 } }] }); } }) }) </script> </body> </html>
原文地址:https://www.cnblogs.com/yb635238477/p/9601284.html