Django之学员管理

Django之学员管理

  实现-------在前端页面提交的数据,后端可直接写入数据库。在页面实现操作数据库的增删改查。

  数据表设计:(三个角色四张表)

    班级表:

      id  title

      1   花果山国小一年级

      2  水帘洞小学二年级

   

    学生表:

      id  name  班级ID (FK)

      1  抠脚大汉  1

      2  一杯倒    2



    老师表:

      id  name

      1  George  

      2  BJ

      3  CF

    

    老师班级关系表:

      id  老师ID  班级ID 

      1    1    1

      2    2    1

      3    2    2

  在Django之初里,我们将几乎所有的url所对应的功能函数都写在里url文件里。这样是不好看也不方便管理的。

  所以,我们会创建很多文件夹,每个文件夹里存放针对某一功能的代码。便于管理代码。

  代码在APP的views.py里。

  在url中,将APP的导入即可。这样url就依旧可以找到相应的函数。  

from APPS import views

 

  在页面拿到数据库表的数据:

    前端classes.html的MK1呈现:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>classes</title>
 6 </head>
 7 <body>
 8     <h1>classes_list</h1>
 9     <table>
10         <thead>
11             <tr>
12                 <th>ID</th>
13                 <th>班级名称</th>
14             </tr>
15         </thead>
16         <tbody>
17             {% for item in class_lsit %}
18                 <tr>
19                     <td>{{ item.cid }}</td>
20                     <td>{{ item.caption }}</td>
21                 </tr>
22             {% endfor %}
23         </tbody>
24     </table>
25 </body>
26 </html>

    后端的views.py 中的classes函数的代码呈现:

 1 def classes(request):
 2     """
 3     链接数据库
 4     :param request: 用户请求的相关的所有信息(对象)
 5     :return:
 6     """
 7     import pymysql
 8     conn = pymysql.connect(host="127.0.0.1",port=3306,user='root',passwd='劳资的数据库密码你也想知道',db='劳资的数据库名字',charset='utf8')
 9     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #改为字典
10     cursor.execute("select cid,caption from classes")
11     class_list = cursor.fetchall()
12     cursor.close()
13     conn.close()
14 
15     return render(request, "classes.html",{"class_lsit":class_list})

   测试结果:如愿拿到了。

  

  总体进阶:MK2

    在classes.html页面,可以在页面直接添加数据并存到数据库保存。

    这样的话,就需要有一个add_class啦。

    MK2.1

    classes.html页面加一个div标签

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>classes</title>
 6 </head>
 7 <body>
 8     <h1>classes_list</h1>
 9     <div>
10         <a href="/add_class/">添加</a>
11     </div>
12     <table>
13         <thead>
14             <tr>
15                 <th>ID</th>
16                 <th>班级名称</th>
17             </tr>
18         </thead>
19         <tbody>
20             {% for item in class_lsit %}
21                 <tr>
22                     <td>{{ item.cid }}</td>
23                     <td>{{ item.caption }}</td>
24                 </tr>
25             {% endfor %}
26         </tbody>
27     </table>
28 </body>
29 </html>

 

  加add_class.html 页面:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>add_class</title>
 6 </head>
 7 <body>
 8     <h1>添加班级</h1>
 9     <form action="">
10         <p>班级名称:<input type="text" placeholder="请输入内容"/></p>
11         <input type="submit" value="提交">
12     </form>
13 </body>
14 </html>

  views.py中的add_class函数:

1 def add_class(request):
2     """
3     前端添加数据到数据库
4     :param request:
5     :return:
6     """
7     return render(request,'add_class.html')

  MK2.5

  现在应该是在add_class页面中添加要提交的数据,点击submit,数据会给数据库,数据库刷新并返回结果。

  而add_class页面也应该再有以一次post请求。完成跳转去classes.html页面。

  add_class函数的实现: 

 1 def add_class(request):
 2     """
 3     前端添加数据到数据库
 4     :param request:
 5     :return:
 6     """
 7     if request.method == "GET":
 8         return render(request,"add_class.html")
 9     else:
10         print(request.POST)
11         v = request.POST.get("caption")
12         conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='XXXXx', db='XXXXx',charset='utf8')
13         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
14         cursor.execute("insert into classes(caption) values(%s)",[v,]) #插入操作
15         conn.commit()  #提交数据
16         cursor.close()
17         conn.close()
18         return redirect("/classes/")

  add_class.html 页面

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>add_class</title>
 6 </head>
 7 <body>
 8     <h1>添加班级</h1>
 9     <form method="POST" action="/add_class/">
10         <p>班级名称:<input type="text" name="caption" placeholder="请输入内容"/></p>
11         <input type="submit" value="提交">
12     </form>
13 </body>
14 </html>

  MK3:删除。在每行数据的后面加一个删除操作按钮。使其可以去数据库删除掉对应的数据。并返回删除后刷新的结果,跳转到classes页面。

  classes.html 页面的删除按钮的添加:

    在删除过程中,设法使其知道要删除的是哪一行的数据。通过id实现。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>classes</title>
 6 </head>
 7 <body>
 8     <h1>classes_list</h1>
 9     <div>
10         <a href="/add_class/">添加</a>
11     </div>
12     <table>
13         <thead>
14             <tr>
15                 <th>ID</th>
16                 <th>班级名称</th>
17                 <th>操作</th>
18             </tr>
19         </thead>
20         <tbody>
21             {% for item in class_lsit %}
22                 <tr>
23                     <td>{{ item.cid }}</td>
24                     <td>{{ item.caption }}</td>
25                     <td><a href="/del_class/?nid={{ item.cid }}">删除</a></td>
26                 </tr>
27             {% endfor %}
28         </tbody>
29     </table>
30 </body>
31 </html>

  del_class函数:

 1 def del_class(request):
 2     """
 3     删除操作
 4     :param request:
 5     :return:
 6     """
 7     #那删除操作的nid。
 8     nid = request.GET.get("nid")
 9     conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='XXXx', db='XXXXx', charset='utf8')
10     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
11     cursor.execute("delete from classes where cid=%s", [nid,])
12     conn.commit()
13     cursor.close()
14     conn.close()
15     return redirect('/classes/')

   改编辑了:

  MK4:

     问题,在后端的编辑的过程中,由于是基于Http协议的请求,所以前端页面在拿到要编辑的数据后,在在编辑完提交时,数据库不知道提交的是哪一行的数据。

    所以,前端需要连同数据行的id也一并拿走,在提交是,也一并返回,好告知数据库是哪一行的数据。

  解决方案一:

  edit_class函数:

 1 def edit_class(request):
 2     """
 3     编辑班级
 4     :param request:
 5     :return:
 6     """
 7     if request.method == "GET":
 8         nid = request.GET.get('nid')
 9         conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='XXXX', db='XXXXXst', charset='utf8')
10         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
11         cursor.execute("select cid,caption from classes where cid=%s", [nid, ])
12         result = cursor.fetchone()
13         cursor.close()
14         conn.close()
15         print(result)
16         return render(request,"edit_class.html",{"result":result})
17     else:
18         nid = request.POST.get("cid")
19         caption = request.POST.get("caption")

   edit_class.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>edit_class</title>
 6 </head>
 7 <body>
 8     <h1>编辑班级</h1>
 9     <form method="POST" action="/edit_class/">
10         <input style="display: none" name="cid" value="{{ result.cid }}">
11         <p>班级名称:<input type="text" name="caption" value="{{ result.caption }}" placeholder="请输入替换数据"></p>
12         <input type="submit" value="submit">
13     </form>
14 </body>
15 </html>

    方案二:区别在前端页面的不通,在与如何隐藏不该用户见到的数据行id。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>edit_class</title>
 6 </head>
 7 <body>
 8     <h1>编辑班级</h1>
 9     <form method="POST" action="/edit_class/?nid={{ result.cid }}">
10         <p>班级名称:<input type="text" name="caption" value="{{ result.caption }}" placeholder="请输入替换数据"></p>
11         <input type="submit" value="submit">
12     </form>
13 </body>
14 </html>

    在views函数中,request也变了。

 1 def edit_class(request):
 2     """
 3     编辑班级
 4     :param request:
 5     :return:
 6     """
 7     if request.method == "GET":
 8         nid = request.GET.get('nid')
 9         conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
10         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
11         cursor.execute("select cid,caption from classes where cid=%s", [nid, ])
12         result = cursor.fetchone()
13         cursor.close()
14         conn.close()
15         print(result)
16         return render(request,"edit_class.html",{"result":result})
17     else:
18         nid = request.GET.get("nid")  #这里与方案一的不一样
19         caption = request.POST.get("caption")
20         conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest',charset='utf8')
21         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
22         cursor.execute("update classes set caption=%s where cid=%s",[caption,nid,])
23         conn.commit()
24         cursor.close()
25         conn.close()
26         return redirect("/classes/")

 

----------------以上是班级的增删改操作。----------------

 老师的操作同理。就直接上最终版本啦。

teacher.html 页面代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>teacher</title>
 6 </head>
 7 <body>
 8     <h1>老师表</h1>
 9     <div>
10         <a href="/add_teacher/">添加</a>
11     </div>
12     <table>
13         <thead>
14             <tr>
15                 <th>ID</th>
16                 <th>name</th>
17                 <th>操作</th>
18             </tr>
19         </thead>
20         <tbody>
21             {% for foo in teacher_list %}
22                 <tr>
23                     <td>{{ foo.id }}</td>
24                     <td>{{ foo.name }}</td>
25                     <td>
26                         <a href="/del_teacher/?nid={{ foo.id }}">删除</a>
27                         |
28                         <a href="/edit_teacher/?nid={{ foo.id }}">编辑</a>
29                     </td>
30                 </tr>
31             {% endfor %}
32         </tbody>
33     </table>
34 </body>
35 </html>

add_teacher.html 页面代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>add_teacher</title>
 6 </head>
 7 <body>
 8     <h1>添加老师表</h1>
 9     <form method="POST" action="/add_teacher/">
10         <p>老师添加:<input type="text" name="name" placeholder="添加老师"/></p>
11         <input type="submit" value="submit">
12     </form>
13 </body>
14 </html>

edit_teacher.html 页面代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>edit_teacher</title>
 6 </head>
 7 <body>
 8     <h1>编辑老师</h1>
 9     <form method="POST" action="/edit_teacher/?nid={{ result.id }}">
10         <p>老师名称:<input type="text" name="name" value="{{ result.name }}" placeholder="请输入替换数据"></p>
11         <input type="submit" value="submit">
12     </form>
13 </body>
14 </html>

teacher相关函数功能代码:

 1 def teacher(request):
 2     conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
 3     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
 4     cursor.execute("select id,name from user")
 5     teacher_list = cursor.fetchall()
 6     cursor.close()
 7     conn.close()
 8     return render(request,"teacher.html",{"teacher_list":teacher_list})
 9 
10 def add_teacher(request):
11     if request.method == "GET":
12         return render(request,"add_teacher.html")
13     else:
14         print(request.POST)
15         v = request.POST.get("caption")
16         conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest',charset='utf8')
17         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
18         cursor.execute("insert into user(name) values(%s,)", [v,])
19         conn.commit()
20         cursor.close()
21         conn.close()
22         return redirect("/teacher/")
23 
24 def del_teacher(request):
25     """
26     删除操作
27     :param request:
28     :return:
29     """
30     # 那删除操作的nid。
31     nid = request.GET.get("id")
32     conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
33     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
34     cursor.execute("delete from user where id=%s", [nid, ])
35     conn.commit()
36     cursor.close()
37     conn.close()
38     return redirect('/teacher/')
39 
40 
41 def edit_teacher(request):
42     """
43     编辑老师
44     :param request:
45     :return:
46     """
47     if request.method == "GET":
48         nid = request.GET.get('nid')
49         conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest',charset='utf8')
50         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
51         cursor.execute("select id,name from user where id=%s", [nid, ])
52         result = cursor.fetchone()
53         cursor.close()
54         conn.close()
55         print(result)
56         return render(request, "edit_teacher.html", {"result": result})
57     else:
58         id = request.GET.get("nid")
59         name = request.POST.get("name")
60         conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest',
61                                charset='utf8')
62         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
63         cursor.execute("update user set name=%s where id=%s",[name,id,])
64         conn.commit()
65         cursor.close()
66         conn.close()
67         return redirect("/teacher/")
68 
69 
70 # Create your views here.

 ----------------------------- 以上就是老师表的全部代码 -------------------

 

学生表,这里的学生表就要出现一对多的关系了。一个班级对应多个学生。

  学生表这里讲用到模态对话框和Ajax的知识。

  获取学生表数据:

 1 def students(request):
 2     """
 3     学生列表
 4     :param request:
 5     :return:
 6     """
 7     conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
 8     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
 9     cursor.execute("select student.id,student.name,class.title from student left JOIN class on student.class_id = class.id")
10     students_list = cursor.fetchall()
11     cursor.close()
12     conn.close()
13 
14     return render(request,"students.html",{"students_list":students_list})

  students.html 页面代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>students</title>
 6 </head>
 7 <body>
 8     <h1>students_list</h1>
 9     <div>
10         <a href="/add_students/">添加</a>
11     </div>
12     <table>
13         <thead>
14             <tr>
15                 <th>ID</th>
16                 <th>学生姓名</th>
17                 <th>所属班级</th>
18                 <th>操作</th>
19             </tr>
20         </thead>
21         <tbody>
22             {% for item in students_list %}
23                 <tr>
24                     <td>{{ item.id }}</td>
25                     <td>{{ item.name }}</td>
26                     <td>{{ item.title }}</td>
27                     <td>
28                         <a href="/del_students/?nid={{ item.id }}">删除</a>
29                         |
30                         <a href="/edit_students/?nid={{ item.id }}">编辑</a>
31                     </td>
32                 </tr>
33             {% endfor %}
34         </tbody>
35     </table>
36 </body>
37 </html>

  创建学生信息:也就是添加学生。

  和删除学生信息,删除学生信息和删除班级的一样。

 

 1 def add_students(request):
 2     if request.method == "GET":
 3         conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
 4         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
 5         cursor.execute("select id,title from classes")
 6         class_list = cursor.fetchall()
 7         cursor.close()
 8         conn.close()
 9 
10         return render(request, 'add_students.html', {'class_list': class_list})
11     else:
12         name = request.POST.get('name') #获取POST里的name,也就是前端输入的name
13         class_id = request.POST.get('class_id') #获取班级表,班级的id
14         conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
15         cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
16         cursor.execute("insert into student(name,class_id) values(%s,%s)", [name, class_id, ])
17         conn.commit()
18         cursor.close()
19         conn.close()
20         return redirect('/students/')
21 
22 def del_students(request):
23     nid = request.GET.get("nid")
24     conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
25     cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
26     cursor.execute("delete from students where id=%s", [nid,])
27     conn.commit()
28     cursor.close()
29     conn.close()
30     return redirect('/students/')

 

  add_students.html 页面代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>add_students</title>
 6 </head>
 7 <body>
 8     <h1>添加学生</h1>
 9     <form method="POST" action="/add_students/">
10         <p>学生姓名<input type="text" name="name" /></p>
11         <p>
12             所属班级
13             <select name="class_id">
14                 {% for row in class_list %}
15                     <option value="{{ row.id }}">{{ row.title }}</option>
16                 {% endfor %}
17             </select>
18         </p>
19         <input type="submit" value="提交" />
20     </form>
21 </body>
22 </html>

  接下来是编辑学生表。

  可是,大哥们,劳资频繁的每个函数都要连一下数据库。怎的很烦。我要改一下玩法。将数据库的剔除,单独放在一个文件夹里。用的时候直接导入。

  等到后期,会在每个APP里见model。model里写ORM,就更方便了,但是现在慢慢来!

  创建一个utils,里边写一个sqlheper.py,这个py文件,放pymysql的操作。

  sqlheper.py

import pymysql

def get_list(sql,args):
    """
    获取列表信息
    :param sql: pymysql语句
    :param args:
    :return:
    """
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql,args)
    result = cursor.fetchall()
    cursor.close()
    conn.close()
    return result

def get_one(sql,args):
    """
   获取一条数据信息
    :param sql: pymysql语句
    :param args:
    :return:
    """
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql,args)
    result = cursor.fetchone()
    cursor.close()
    conn.close()
    return result

def modify(sql,args):
    """
    更新,删除,修改
    :param sql: pymysql语句
    :param args:
    :return:
    """
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='redhat', db='GeorgeTest', charset='utf8')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql,args)
    conn.commit()
    cursor.close()
    conn.close()

  编辑学生表的函数:edit_students:

 1 from utils import sqlheper
 2 def edit_student(request):
 3     if request.method == "GET":
 4         nid = request.GET.get('nid')
 5         class_list = sqlheper.get_list("select id,title from class",[])
 6         # 获取所有班级 sqlheper.get_list()
 7         current_student_info = sqlheper.get_one('select id,name,class_id from student where id=%s',[nid,])
 8         # 获取一条数据信息 sqlheper.get_one()
 9         return render(request,'edit_student.html',{'class_list': class_list,'current_student_info':current_student_info})
10     else:
11         nid = request.GET.get('nid')
12         name = request.POST.get('name')
13         class_id = request.POST.get('class_id')
14         sqlheper.modify('update student set name=%s,class_id=%s where id=%s',[name,class_id,nid,])
15         return redirect('/students/')

  edit_students.html 页面代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>edit_students</title>
 6 </head>
 7 <body>
 8     <h1>编辑学生</h1>
 9     <form method="POST" action="/edit_students/?nid={{  current_student_info.id }}">
10 
11         <p>学生姓名<input type="text" name="name"  value="{{ current_student_info.name }}" /></p>
12         <p>
13             所属班级
14             <select name="class_id">
15                 <!-- 循环所有的班级 -->
16                 {% for row in class_list %}
17                     <!-- 如果是当前学生所在班级,则默认选中 -->
18                     {% if row.id == current_student_info.class_id %}
19                         <option selected value="{{ row.id }}">{{ row.title }}</option>
20                     {% else %}
21                         <option value="{{ row.id }}">{{ row.title }}</option>
22                     {% endif %}
23 
24                 {% endfor %}
25             </select>
26         </p>
27         <input type="submit" value="提交" />
28     </form>
29 </body>
30 </html>

 

  对之前的内容优化,其中:

    班级的添加,对空字符串没有识别。所以,如果在添加页面,不添加数据,直接提交是可行的。

    但是,这样不符合设定。对此进行优化。

    优化如下:

    add_classes 函数代码:

 1 def add_class(request):
 2     """
 3     前端添加数据到数据库
 4     :param request:
 5     :return:
 6     """
 7     if request.method == "GET":
 8         return render(request,"add_class.html")
 9     else:
10         print(request.POST)
11         v = request.POST.get("caption")
12         if len(v)>0:
13             conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='GeorgeTest',charset='utf8')
14             cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 改为字典
15             cursor.execute("insert into classes(caption) values(%s)",[v,])
16             conn.commit()
17             cursor.close()
18             conn.close()
19             return redirect("/classes/")
20         else:
21             return render(request,"add_class.html",{"msg":"班级名称不能为空"})

 add_classes.html 页面代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>add_class</title>
 6 </head>
 7 <body>
 8     <h1>添加班级</h1>
 9     <form method="POST" action="/add_class/">
10         <p>班级名称:<input type="text" name="caption" placeholder="请输入内容"/></p>
11         <input type="submit" value="提交">{{ msg }}
12     </form>
13 </body>
14 </html>

  以后再views中,对用户提交的数据进行判断,要用form组件。

 

   模态对话框:

    就是在前端做两层装饰,第一层是遮罩层,第二层是内容层(对话框)。

    针对班级管理,进行进一步的优化,用模态对话框的知识。

    班级管理:

      -添加操作。用模态对话框实现。

          模态对话框有两层,就写两个div。

          但要在前端的页面里加装饰,在head里加。

          .shadow加在遮罩层。

          .modal 加在内容层。

          模态对话框加在classes.html 里。

          用到了form表单提交,form表提交会导致页面刷新。 

          页面一涮新,模态对话框就不保留了。

 

 classes.html 页面:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>classes</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         .modal{
21             z-index: 1000;
22             position: fixed;
23             left: 50%;
24             top: 50%;
25             height: 300px;
26             width: 400px;
27             background-color: white;
28             margin-left: -200px;
29             margin-top: -150px;
30         }
31     </style>
32 </head>
33 <body>
34     <h1>classes_list</h1>
35     <div>
36         <a href="/add_class/">添加</a>
37         |
38         <a onclick="showModal();">对话框添加</a>
39     </div>
40     <table>
41         <thead>
42             <tr>
43                 <th>ID</th>
44                 <th>班级名称</th>
45                 <th>操作</th>
46             </tr>
47         </thead>
48         <tbody>
49             {% for item in class_lsit %}
50                 <tr>
51                     <td>{{ item.cid }}</td>
52                     <td>{{ item.caption }}</td>
53                     <td>
54                         <a href="/del_class/?nid={{ item.cid }}">删除</a>
55                         |
56                         <a href="/edit_class/?nid={{ item.cid }}">编辑</a>
57                     </td>
58                 </tr>
59             {% endfor %}
60         </tbody>
61     </table>
62 
63     <div id="shadow" class="shadow hide"></div>
64     <div id="modal" class="modal hide">
65         <form method="POST" action="modal_add_classes" >
66             <p>
67             <input type="text" name="title" placeholder="班级名称">
68             </p>
69             <input type="submit" name="submit">
70         </form>
71 
72     </div>
73     <script>
74         function showModal() {
75             document.getElementById("shadow").classList.remove("hide");   #找到遮罩层,并去挑遮罩层
76             document.getElementById("modal").classList.remove("hide");
77 
78         }
79     </script>
80 </body>
81 </html>

 

 模态对话框添加代码:

 1 def modal_add_classes(request):
 2     #获取前端的title
 3     title = request.POST.get('title')
 4     if len(title) > 0:
 5         sqlheper.modify('insert into class(title) values(%s)',[title,])
 6         # return HttpResponse('ok')
 7         return redirect('/classes/')
 8     elif title == "*?#.":
 9         pass
10     else:
11         return HttpResponse('班级标题不能为空')

 

  对话框提交数据,不建议使用form表单。

   

 在Django中的Ajax的应用:数据提交,建议使用。

    Ajax,在页面不刷新的情况下,默默的向后台提交数据。这里要引入jQuery。

  基于Ajax,创建学员管理的班级:

      给前端的提交按键,绑定事件,onclick="AjaxSend();"

      在script里的function函数里加AjaxSend(),这时在提交时,就是Ajax提交。$.ajax()

      要注意:Ajax提交的数据有指定:

            数据提交到哪里,要指定:url     数据提交到指定的url中

            数据提交的方法,要指定:type   以什么方法提交数据

            数据提交的数据,要指定:data   要提交的数据,字典存储  data:{"title":"XXXXX"}

            定义success:function(data){

              } :作用是,在url,type,data发完数据后,ajax会等。等到服务端处理完了,返回数据了,这个success会自动调用。

                 function里的data是服务端返回的值。

            数据提交成功后,要干嘛:

            数据提交失败后,要干嘛:

      

      ajax提交不能实现跳转,是因为ajax本质上只返回字符串。要想实现跳转,只能自己写JS进行跳转。

=============== Ajax添加 ===============

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>classes</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         .modal{
21             z-index: 1000;
22             position: fixed;
23             left: 50%;
24             top: 50%;
25             height: 300px;
26             width: 400px;
27             background-color: white;
28             margin-left: -200px;
29             margin-top: -150px;
30         }
31     </style>
32 </head>
33 <body>
34     <h1>classes_list</h1>
35     <div>
36         <a href="/add_class/">添加</a>
37         |
38         <a onclick="showModal();">对话框添加</a>
39     </div>
40     <table>
41         <thead>
42             <tr>
43                 <th>ID</th>
44                 <th>班级名称</th>
45                 <th>操作</th>
46             </tr>
47         </thead>
48         <tbody>
49             {% for item in class_lsit %}
50                 <tr>
51                     <td>{{ item.cid }}</td>
52                     <td>{{ item.caption }}</td>
53                     <td>
54                         <a href="/del_class/?nid={{ item.cid }}">删除</a>
55                         |
56                         <a href="/edit_class/?nid={{ item.cid }}">编辑</a>
57                     </td>
58                 </tr>
59             {% endfor %}
60         </tbody>
61     </table>
62 
63     <div id="shadow" class="shadow hide"></div>
64     <div id="modal" class="modal hide">
65         <form method="POST" action="modal_add_classes" >
66             <p>
67             <input id="title" type="text" name="title" placeholder="班级名称">
68             </p>
69             <input type="button" name="submit" onclick="AjaxSend();"/>
70         </form>
71 
72     </div>
73     <script src="/static/jquery-1.12.4.js"></script>
74     <script>
75         function showModal() {
76             document.getElementById("shadow").classList.remove("hide");   #找到遮罩层,并去挑遮罩层
77             document.getElementById("modal").classList.remove("hide");
78 
79         }
80         function AjaxSend() {
81             $.ajax({
82                 url:'/modal_add_classes/',
83                 type:'POST',
84                 data:{"title":$("#title").val()},  //拿到全段输入的值
85                 success:function (data) {
86                     //当服务端处理完成后,返回数据时,该函数自动调用
87                     //data是服务端返回的值
88                     console.log(data);
89                     if(data=="ok"){
90                         alert('添加成功');
91                     }else {
92                         alert('添加失败');
93                     }
94                 }
95             })
96         }
97     </script>
98 </body>
99 </html>

   提交的解决方案:

    在提交的后面加一个span标签。 

<span id="errormsg"></span>

 

  效果:classes.html  

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>classes</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         .modal{
 21             z-index: 1000;
 22             position: fixed;
 23             left: 50%;
 24             top: 50%;
 25             height: 300px;
 26             width: 400px;
 27             background-color: white;
 28             margin-left: -200px;
 29             margin-top: -150px;
 30         }
 31     </style>
 32 </head>
 33 <body>
 34     <h1>classes_list</h1>
 35     <div>
 36         <a href="/add_class/">添加</a>
 37         |
 38         <a onclick="showModal();">对话框添加</a>
 39     </div>
 40     <table>
 41         <thead>
 42             <tr>
 43                 <th>ID</th>
 44                 <th>班级名称</th>
 45                 <th>操作</th>
 46             </tr>
 47         </thead>
 48         <tbody>
 49             {% for item in class_lsit %}
 50                 <tr>
 51                     <td>{{ item.cid }}</td>
 52                     <td>{{ item.caption }}</td>
 53                     <td>
 54                         <a href="/del_class/?nid={{ item.cid }}">删除</a>
 55                         |
 56                         <a href="/edit_class/?nid={{ item.cid }}">编辑</a>
 57                     </td>
 58                 </tr>
 59             {% endfor %}
 60         </tbody>
 61     </table>
 62 
 63     <div id="shadow" class="shadow hide"></div>
 64     <div id="modal" class="modal hide">
 65         <form method="POST" action="modal_add_classes" >
 66             <p>
 67             <input id="title" type="text" name="title" placeholder="班级名称">
 68             </p>
 69             <input type="button" name="submit" onclick="AjaxSend();"/><span id="errormsg"></span>
 70             <input type="button" name="取消" onclick="cancleModal();"/>
 71         </form>
 72 
 73     </div>
 74     <script src="/static/jquery-1.12.4.js"></script>
 75     <script>
 76         function showModal() {
 77             document.getElementById("shadow").classList.remove("hide");   //找到遮罩层,并去挑遮罩层
 78             document.getElementById("modal").classList.remove("hide");
 79 
 80         }
 81         function cancleModal() {
 82             document.getElementById('shadow').classList.add('hide');
 83             document.getElementById('modal').classList.add('hide')
 84         }
 85         function AjaxSend() {
 86             $.ajax({
 87                 url:'/modal_add_classes/',
 88                 type:'POST',
 89                 data:{"title":$("#title").val()},  //拿到全段输入的值
 90                 success:function (data) {
 91                     //当服务端处理完成后,返回数据时,该函数自动调用
 92                     //data是服务端返回的值
 93                     console.log(data);
 94                     if(data=="ok"){
 95                         location.href='/classes/'; //指定提交成功后跳转到哪里
 96                     }else {
 97                         $('#errormsg').text(data);
 98                     }
 99                 }
100             })
101         }
102     </script>
103 </body>
104 </html>

  modal_add_classes:

 1 def modal_add_classes(request):
 2     #获取前端的title
 3     title = request.POST.get('title')
 4     if len(title) > 0:
 5         sqlheper.modify('insert into class(title) values(%s)',[title,])
 6         return HttpResponse('ok')
 7         # return redirect('/classes/')
 8     elif title == "*?#.":
 9         pass
10     else:
11         return HttpResponse('班级标题不能为空')

 

============  班级的编辑操作,用ajax实现:单表的  =============

      技巧,对于a标签的事件,跳转的问题,可以绑定再绑定一个事件,跳转到别的地方。

      在a标签中的onclick事件中加return。

      在function modelEdit(){

        alert(123);

        return false

      }

       在return 这里是关键,事件优先执行onclick,执行完后执行href,返回return,在function中将return的返回值设为False,就不会执行href里要跳转的url。

        改为True,就会进行跳转。

        这个功能用在form表单里。

      在点击编辑后,需要将要编辑的内容放在编辑框,需要做的方法是,将获取当前点击的标签,以及他上一级的标签。

        其次是标签父标签,再找其上方标签。

 后端代码:

 1 def modal_edit_classes(request):
 2     ret = {"status":True,"message":None}
 3     try:
 4         nid = request.POST.get("nid") # 拿id
 5         content = request.POST.get("content") #拿内容
 6         sqlheper.modify("update class set title=%s where id=%s",[content,nid,])
 7     except Exception as e:
 8         ret['status'] = False
 9         ret['message'] = "处理异常"
10     return HttpResponse(json.dumps(ret)) #json将数据转成字符串,在发给前端

前端代码:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>classes</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         .modal{
 21             z-index: 1000;
 22             position: fixed;
 23             left: 50%;
 24             top: 50%;
 25             height: 300px;
 26             width: 400px;
 27             background-color: white;
 28             margin-left: -200px;
 29             margin-top: -150px;
 30         }
 31     </style>
 32 </head>
 33 <body>
 34     <h1>classes_list</h1>
 35     <div>
 36         <a href="/add_class/">添加</a>
 37         |
 38         <a onclick="showModal();">对话框添加</a>
 39     </div>
 40     <table>
 41         <thead>
 42             <tr>
 43                 <th>ID</th>
 44                 <th>班级名称</th>
 45                 <th>操作</th>
 46             </tr>
 47         </thead>
 48         <tbody>
 49             {% for item in class_lsit %}
 50                 <tr>
 51                     <td>{{ item.cid }}</td>
 52                     <td>{{ item.caption }}</td>
 53                     <td>
 54                         <a href="/del_class/?nid={{ item.cid }}">删除</a>
 55                         |
 56                         <a onclick="modelEdit();">对话框删除</a>
 57                         |
 58                         <a href="/edit_class/?nid={{ item.cid }}">编辑</a>
 59                     </td>
 60                 </tr>
 61             {% endfor %}
 62         </tbody>
 63     </table>
 64 
 65     <div id="shadow" class="shadow hide"></div>
 66     <div id="modal" class="modal hide">
 67         <form method="POST" action="modal_add_classes" >
 68             <p>
 69             <input id="title" type="text" name="title" placeholder="班级名称">
 70             </p>
 71             <input type="button" name="submit" onclick="AjaxSend();"/><span id="errormsg"></span>
 72             <input type="button" name="取消" onclick="cancleModal();"/>
 73         </form>
 74     </div>
 75 
 76     <div id="editModel" class="modal hide">
 77         <h3>编辑框</h3>
 78         <p>
 79             <input id="editId" type="text" name="id" style="display: none" />
 80             <input id="editTitle" type="text" name="title" />
 81         </p>
 82         <input type="button" value="提交" onclick="editAjaxSend();" /><span id="errormsg"></span>
 83         <input type="button" value="取消" onclick="cancleModal();" />
 84     </div>
 85     <script src="/static/jquery-1.12.4.js"></script>
 86     <script>
 87         function showModal() {
 88             document.getElementById("shadow").classList.remove("hide");   //找到遮罩层,并去挑遮罩层
 89             document.getElementById("modal").classList.remove("hide");
 90 
 91         }
 92 
 93         function cancleModal() {
 94             document.getElementById('shadow').classList.add('hide');
 95             document.getElementById('modal').classList.add('hide')
 96             document.getElementById('eidtModal').classList.add('hide')
 97         }
 98 
 99         function AjaxSend() {
100             $.ajax({
101                 url:'/modal_add_classes/',
102                 type:'POST',
103                 data:{"title":$("#title").val()},  //拿到全段输入的值
104                 success:function (data) {
105                     //当服务端处理完成后,返回数据时,该函数自动调用
106                     //data是服务端返回的值
107                     console.log(data);
108                     if(data=="ok"){
109                         location.href='/classes/'; //指定提交成功后跳转到哪里
110                     }else {
111                         $('#errormsg').text(data);
112                     }
113                 }
114             })
115         }
116 
117         function modelEdit(ths) {
118             document.getElementById("shadow").classList.remove("hide");   //找到遮罩层,并去挑遮罩层
119             document.getElementById("editModel").classList.remove("hide");
120             /*
121             1、获取当前点击标签
122             2、获取当前标签的父标签,再找其上方标签
123             3、获取当前行班级名称,赋值到编辑对话框中
124             */
125             var row = $(ths).parent().prevAll();
126             var content = $(row[0]).text();
127             $('editTitle').val(content);
128 
129             var contentId = $(row[1].text());
130             $('#editId').var(contentId);
131 
132         }
133 
134         function editAjaxSend() {
135             var nid = $('#editID').val();
136             var content = $('#editTitle').val();
137             console.log(nid,content);
138             $.ajax({
139                 url:'/modal_edit_classes/',
140                 type:"POST",
141                 data:{"nid":nid,"content":content},
142                 success:function (arg) {
143                     // arg字符串类型
144                     // JSON.parse(字符串) => 对象
145                     // JSON.stringify(对象) => 字符串
146                     arg = JSON.parse(arg);
147                     if(arg.status){
148                         //location.href="/classes/"
149                         location.reload();
150                     }else{
151                         alert(arg.message);
152                     }
153                 }
154             })
155         }
156     </script>
157 </body>
158 </html>

 

 

 

================== ajax 学生表,一对多,添加 ================== 

  绑定事件,都是基于jQuery。

  jQuery也可以阻止默认事件的发生。

1 <script>
2     //绑定事件。
3     $(function () {
4         $("#modal_add_students").click(function () {
5             alert(123);
6             return false;   #阻止默认事件
7         })
8     })
9 </script>

 

后端代码:

 1 def modal_add_students(request):
 2     ret = {"status":True,"message":None}
 3 
 4     try:
 5         name = request.POST.get("name")
 6         classes_id = request.POST.get("classes_id")
 7         sqlheper.modify('insert into students(name,classes_id) values(%s,%s)',[name,classes_id,])
 8     except Exception as e:
 9         ret['status'] = False
10         ret['message'] = str(e)
11 
12     return HttpResponse(json.dumps(ret))

 

前端代码:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>students</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         .add-modal{
 21             z-index: 1000;
 22             position: fixed;
 23             left: 50%;
 24             top: 50%;
 25             height: 300px;
 26             width: 400px;
 27             background-color: white;
 28             margin-left: -200px;
 29             margin-top: -150px;
 30         }
 31     </style>
 32 </head>
 33 <body>
 34     <h1>students_list</h1>
 35     <div>
 36         <a href="/add_students/">添加</a>
 37         |
 38         <a onclick="modal_add_students">对话框添加</a>
 39     </div>
 40     <table>
 41         <thead>
 42             <tr>
 43                 <th>ID</th>
 44                 <th>学生姓名</th>
 45                 <th>所属班级</th>
 46                 <th>操作</th>
 47             </tr>
 48         </thead>
 49         <tbody>
 50             {% for item in students_list %}
 51                 <tr>
 52                     <td>{{ item.id }}</td>
 53                     <td>{{ item.name }}</td>
 54                     <td>{{ item.title }}</td>
 55                     <td>
 56                         <a href="/del_students/?nid={{ item.id }}">删除</a>
 57                         |
 58                         <a href="/edit_students/?nid={{ item.id }}">编辑</a>
 59                     </td>
 60                 </tr>
 61             {% endfor %}
 62         </tbody>
 63     </table>
 64 
 65     <div id="shadow" class="shadow hide"></div>
 66     <div id="addModal" class="add-modal hide"></div>
 67 
 68         <p>
 69             Name:<input id="addName" type="text" name="name" placeholder="Name">
 70         </p>
 71         <p>
 72             Classes:<input id="addClassesId" type="text" name="Classes" placeholder="Classes">
 73             <select name="classesID" >
 74                 {% for row in classes_list %}
 75                     <option value="{{ row.id }}">{{ row.title }}</option>
 76                 {% endfor %}
 77 
 78             </select>
 79         </p>
 80     <input id="btnAdd" type="button" value="添加" />
 81     <span id="addError" style="color: red;"></span>
 82 
 83     <script src="/static/jquery-1.12.4.js"></script>
 84     <script>
 85         //绑定事件。
 86         $(function () {
 87             $("#addModal").click(function () {
 88                 $("#shadow,#addModal").removeClass('hide');
 89             })
 90             
 91             $('#btnAdd').click(function () {
 92                 $.ajax({
 93                     url:"/modal_add_students/",
 94                     type:"POST",
 95                     data:{"name":$("#addName").val(),"classes_id":$("#addClassesId").val()},
 96                     success:function (arg) {
 97                         //回调函数,
 98                         //console.log(arg); //将数据发送给后台
 99                         arg = JSON.parse(arg);
100                         if(arg.status){
101                             location.reload();
102                         }else{
103                             $("#addError").text(arg.message);
104                         }
105                     }
106                 })
107             })
108         })
109     </script>
110 </body>
111 </html>

 

--------- END ----------

  

posted @ 2018-08-09 10:09  王先生是胖子  阅读(226)  评论(0编辑  收藏  举报