Django之学员管理四

Django之学员管理四

  今天来讲解一下学员管理的多对多的后面的操作实现,分别是多对多的添加和编辑,以及多对多的ajax的添加和编辑操作。

  在我们之前的三期的文章里,可以发现,这个学员管理,可以有很多的方向可以变化,最为明显的是后台管理平台。当然也可以是公司内网crm的部门管理小功能。但是,在这里,我们的方向,就要最终将这个学员管理慢慢完善成后台管理。

  那么我们就来今天的内容,先来搞一搞多对多的添加。

  多对多的添加操作:

  多对多的添加操作要注意一点,就是在添加时,老师的名称是不应当是输入填写的,而是应该是在老师表里去获取。同样,授课班级的名称也不应该是输入的,也应该是去班级表里去获取,但问题是一个老师,是可以有多个授课班级的,所以,授课班级可以是多个,那么在前端如何实现,多选班级呐?我们来看一下具体代码实现,就知道啦!其实很简单,只有一个小小的属性而已。

  前端 add_teacherandclass_add.html 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>添加老师任课班级</title>
 6 </head>
 7 <body>
 8     <h2>添加老师任课班级</h2>
 9     <form method="POST" action="/add_teacherandclass_add/">
10         <p>老师姓名:<input type="text" name="name" placeholder="Teacher Name"></p>
11         <p>任课班级:
12             <select multiple size="5" name="classes_nids" >
13                 {% for foo in class_list %}
14                     <option value="{{ foo.nid }}">{{ foo.title }}</option>
15                 {% endfor %}
16             </select>
17         </p>
18         <input type="submit" value="submit">
19     </form>
20 </body>
21 </html>
View Code 

  view.py 视图函数 add_teacherandclass_add

 1 def add_teacherandclass_add(request):
 2     if request.method == "GET":
 3         class_list = sqlheper.get_list("select nid,title from classes",[])
 4         return render(request, "add_teacherandclass_add.html",{"class_list":class_list})
 5     else:
 6         name = request.POST.get("name")
 7         #在老师表添加一条数据。
 8         teacher_nid = sqlheper.create("insert into teacher(name) values(%s)",[name,])
 9         classes_nids = request.POST.getlist("classes_nids")   #getlist 是获取多个值
10         print(classes_nids)
11         #在老师班级关系表,插入老师和班级的数据,一个老师会有多个班级,但一个老师和一个班级,依旧是一行数据
12 
13         # 用循环实现插入功能
14         # for cls_id in classes_nids:
15         #     print(cls_id)
16         #     sqlheper.modify("insert into teacherandclasses(teacher_id,class_id) values(%s,%s)",[teacher_nid,cls_id])
17         #     print("1")
18 
19         #连接一次,断一次,效率依旧不高
20         # obj = sqlheper.SqlHelper()
21         # print(obj)
22         # for cls_id in classes_nids:
23         #     print(cls_id)
24         #     obj.modify("insert into teacherandclasses(teacher_id,class_id) values(%s,%s)",[teacher_nid,cls_id])
25         # obj.close()
26 
27         #一次连接,一次提交,但提交了多条数据
28         data_list = []
29         print(data_list)
30         for cls_id in classes_nids:
31             temp = (teacher_nid,cls_id,)
32             print(temp)
33             data_list.append(temp)
34             print(data_list)
35         obj = sqlheper.SqlHelper()
36         obj.multiple_modify('insert into teacherandclasses(teacher_id,class_id) values(%s,%s)',data_list)
37         obj.close()
38         return redirect('/teacherandclass/')
View Code

   

   多对多的编辑操作:

   在多对多的编辑中,需要注意的是,老师是有默认值的,老师的任课班级也是有的。在编辑时,老师的所任课班级是有默认值,但是在编辑时,任课班级应该是班级表的全部数据,因为需要修改任课班级,所以在这里需要拿取三个值。并且在修改时,是修改两张表,一张老师表,一张老师班级关系表。

  前端 edit_teacherand_edit.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>编辑老师及任课班级</title>
 6 </head>
 7 <body>
 8     <h2>编辑老师及任课班级</h2>
 9     <form method="POST" action="/edit_teacherandclass_edit/?nid={{ teacher_info.nid }}">
10         <p>老师姓名:<input type="text" name="name" value="{{ teacher_info.name }}" placeholder="Teacher Name"></p>
11         <p>任课班级:
12             <select multiple size="10" name="classes_nids" >
13                 {% for item in classes_list %}
14                     {% if item.nid in class_id_list %}
15                         <option value="{{ item.nid }}" selected>{{ item.title }}</option>
16                     {% else %}
17                         <option value="{{ item.nid }}">{{ item.title }}</option>
18                     {% endif %}
19                 {% endfor %}
20             </select>
21         </p>
22         <input type="submit" value="submit">
23     </form>
24 </body>
25 </html>
View Code

  views.py 的视图函数 edit_teacherand_edit

 1 def edit_teacherandclass_edit(request):
 2     if request.method =="GET":
 3         tid = request.GET.get("tid")
 4         obj = sqlheper.SqlHelper()
 5         teacher_info = obj.get_one("select nid,name from teacher where nid=%s",[tid])
 6         #拿取当前老师id
 7         class_id_list = obj.get_list("select class_id from teacherandclasses where teacher_id=%s",[tid])
 8         #拿取老师所关联的班级id
 9         classes_list = obj.get_list("select * from classes",[])
10         obj.close()
11         temp = []
12         for i in class_id_list:
13             temp.append(i["class_id"])
14             # print("所有班级",classes_list)
15         return render(request,"edit_teacherandclass_edit.html",{
16             "teacher_info":teacher_info,
17             "class_id_list":temp,
18             "classes_list":classes_list,
19         })
20     else:
21         nid = request.GET.get("nid")
22         #这里的nid 用GET获取是因为edit_teacherandclass_edit的传参方式是在url传参的,因为url传参,参数自动放到GET里
23         #问题,班级的就是POST是因为班级的数据是用POST发送的,nid是在随form表单,以POST的形式发送的,但nid是在action的url中的,所以要单独用GET。
24         name = request.POST.get("name")
25         classes_nids = request.POST.getlist("classes_nids")
26         #更新老师表
27         obj = sqlheper.SqlHelper()
28         obj.modify("update teacher set name=%s where nid=%s",[name,nid])
29         #更新老师班级关系表
30         #这里的方案是先把当前老师和班级的对应关系删除,然后在新添加
31         obj.modify("delete from teacherandclasses where teacher_id=%s",[nid])
32         data_list = []
33         print(data_list)
34         for cls_id in classes_nids:
35             temp = (nid, cls_id,)
36             print(temp)
37             data_list.append(temp)
38             print(data_list)
39         obj = sqlheper.SqlHelper()
40         obj.multiple_modify('insert into teacherandclasses(teacher_id,class_id) values(%s,%s)', data_list)
41         obj.close()
42         return redirect("/teacherandclass/")
View Code

  多对多的删除操作:

   有待添加!!!!

  多对多的ajax的添加操作:

   多对多的ajax添加操作,问题点在于要单次添加多个班级,同时要操作两张表,所以在ajax传值的地方,是需要注意的。

  前端 teacherandclass.html

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>teacherandclass</title>
  6     <style>
  7         .hide{
  8             display: none;
  9         }
 10         .shadow{
 11             position: fixed;
 12             left: 0;
 13             top: 0;
 14             right: 0;
 15             bottom: 0;
 16             background-color: black;
 17             opacity: 0.4;
 18             z-index: 999;
 19         }
 20         .loading{
 21             position: fixed;
 22             width: 32px;
 23             height: 32px;
 24             left: 60%;
 25             top: 60%;
 26             margin-left: -16%;
 27             margin-top: -16%;
 28             background-image: url("/static/images/loading.gif");
 29         }
 30         .modal{
 31             z-index: 1000;
 32             position: fixed;
 33             left: 50%;
 34             top: 50%;
 35             height: 300px;
 36             width: 400px;
 37             background-color: white;
 38             margin-left: -200px;
 39             margin-top: -150px;
 40         }
 41     </style>
 42 </head>
 43 <body>
 44     <h1>老师和班级关系表</h1>
 45     <div>
 46         <a href="/add_teacherandclass_add/">添加老师任课班级</a>
 47         |
 48         <a id="btnAdd">对话框添加老师任课班级</a>
 49     </div>
 50     <table border="1">
 51         <thead>
 52             <tr>
 53                 <th>ID</th>
 54                 <th>Teacher name</th>
 55                 <th>Class name</th>
 56                 <th>操作</th>
 57             </tr>
 58         </thead>
 59         <tbody>
 60             {% for foo in teacher_class_list %}
 61                 <tr>
 62                     <td>{{ foo.tid }}</td>
 63                     <td>{{ foo.name }}</td>
 64                     <td>
 65                         {% for item in foo.titles %}
 66                             <span style="display: inline-block;padding: 5px;border: 1px solid red;">{{ item }}</span>
 67                         {% endfor %}
 68                     </td>
 69                     <td>
 70                         <a href="/edit_teacherandclass_edit/?tid={{ foo.tid }}">Edit</a>
 71                         |
 72                         <a id="btnEdit">对话框编辑老师任课班级</a>
 73                         |
 74                         <a href="/del_teacherandclass_del/?tid={{ foo.tid }}">Delete</a>
 75                     </td>
 76                 </tr>
 77             {% endfor %}
 78         </tbody>
 79     </table>
 80 
 81     <div id="shadow" class="shadow hide"></div>
 82     <div id="loading" class="loading hide"></div>
 83 
 84     <div id="modal" class="modal hide">
 85         <p>添加老师:<input id="addName" type="text" name="name" placeholder="老师名称"></p>
 86         <p>添加班级:
 87             <select id="classIds" multiple size="10"></select>
 88         </p>
 89         <a id="addSubmit">submit</a>
 90         <input type="button" value="cancel" onclick="cancleModal();"/><span id="errormsg"></span>
 91     </div>
 92 
 93     <script src="/static/jquery-1.12.4.js"></script>
 94     <script>
 95         $(function () {
 96             btnAdd();
 97             btnAddSubmit();
 98         });
 99 
100         function btnAdd() {
101             $("#btnAdd").click(function () {
102                 $("#shadow,#loading").removeClass("hide");
103                 /*
104                 发送ajax请求,获取所有班级信息
105                 再classesIds下拉框中生成option所有的项目
106                  */
107                 $.ajax({
108                     url:"/get_all_class/",
109                     type:"GET",
110                     dataType:"JSON",
111                     success:function (arg) {
112                         //这个arg是一个列表,列表里面是一个个的字典
113                         console.log(arg);
114                         //这个arg是字符串类型,并将所拿到是数据添加到select框里面,里面是一个一个的option
115                         $.each(arg,function (i,row) {
116                             var tag = document.createElement("option");
117                             tag.innerHTML = row.title;
118                             tag.setAttribute("value",row.nid);
119                             $("#classIds").append(tag);
120 
121                         });
122                         $("#loading").addClass("hide");
123                         $("#modal").removeClass("hide");
124                         //each是将arg循环,function是要被循环的项
125                     }
126                 })
127             })
128         }
129         
130         function btnAddSubmit() {
131             $("#addSubmit").click(function () {
132                 var name = $("#addName").val();
133                 var class_id_list = $("#classIds").val();
134                 console.log(name,class_id_list);
135                 $.ajax({
136                     url:'/model_add_teacherandclass_ajax/',
137                     type:"POST",
138                     data:{"name":name,"class_id_list":class_id_list}, // 这里的class_id_list 由之前的字符串变成了列表
139                     dataType:"JSON",
140                     traditional:true, //这是将class_id_list不做处理,直接发给后台,这样后台就可以拿到列表的数据类型,
141                     //如何提交的数据的值有列表,则需要添加此属性
142                     success:function (arg) {
143                         if (arg.status){
144                             location.reload();
145                         }else {
146                             alert(arg.message);
147                         }
148                     }
149                 })
150             })
151         }
152     </script>
153 </body>
154 </html>
View Code

  后端 model_add_teacherandclass_ajax

 1 def model_add_teacherandclass_ajax(request):
 2     ret = {"status":True,"message":None}
 3     try:
 4         name = request.POST.get("name")
 5         class_id_list = request.POST.getlist("class_id_list")
 6         teacher_id = sqlheper.create("insert into teacher(name) values(%s)",[name,])
 7         data_list = []
 8         for cls_id in class_id_list:
 9             temp = (teacher_id,cls_id)
10             data_list.append(temp)
11         obj = sqlheper.SqlHelper()
12         obj.multiple_modify("insert into teacherandclasses(teacher_id,class_id) values(%s,%s)",data_list)
13         obj.close()
14     except Exception as e:
15         ret["status"] = False
16         ret["message"] = "处理失败"
17     return HttpResponse(json.dumps(ret))
18 
19 def get_all_class(request):
20     import time
21     time.sleep(1)
22     obj = sqlheper.SqlHelper()
23     class_list = obj.get_list("select nid,title from classes",[])
24     obj.close()
25     #return 返回的class_list 用json.dumps序列化一下
26     return HttpResponse(json.dumps(class_list))
View Code

  多对多的ajax的编辑操作:

  有待添加!!!!

 

原文地址:https://www.cnblogs.com/george92/p/11153867.html