Django之学员管理二

  学生表的一对多的增删改查

views.py

def students(request):
#select students.sid,students.name,classes.title from students left JOIN classes on students.classes_id=classes.nid;
conn = pymysql.connect(host="127.0.0.1",port=3306,user='root',passwd='redhat',db='weibo',charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #改为字典
cursor.execute("select students.sid,students.name,classes.title from students left JOIN classes on students.classes_id=classes.nid;")
students_list = cursor.fetchall()
print("students",students_list)
cursor.close()
conn.close()
return render(request, "students.html", {"students_list": students_list}) def add_students_add(request):
if request.method=="GET":
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='weibo', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 改为字典
cursor.execute("select nid,title from classes")
class_list = cursor.fetchall()
print("classes", class_list)
cursor.close()
conn.close()
return render(request,"add_students.html",{"class_list":class_list})
else:
htminput_name = request.POST.get("name")
classes_id = request.POST.get("classes_id")
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='weibo', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 改为字典
cursor.execute("insert into students(name,classes_id) value(%s,%s)",[htminput_name,classes_id])
conn.commit()
cursor.close()
conn.close()
return redirect("/students/") def del_students_del(request):
sid = request.GET.get("sid")
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='weibo', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 改为字典
cursor.execute("delete from students where sid=%s",[sid,])
conn.commit()
cursor.close()
conn.close()
return redirect("/students/") from utils import sqlheper
def edit_students_edit(request):
if request.method == "GET":
sid = request.GET.get("sid")
class_list = sqlheper.get_list("select * from classes",[])
students_name = sqlheper.get_one("select sid,name,classes_id from students where sid=%s",[sid,])
return render(request,"edit_students.html",{"class_list":class_list,"students_name":students_name})
else:
sid = request.GET.get("sid")
name = request.POST.get("name")
classes_id = request.POST.get("classes_id")
sqlheper.modify("update students set name=%s,classes_id=%s where sid=%s",[name,classes_id,sid])
return redirect("/students/")

  

sqlheper.py

import pymysql

def get_list(sql,args):
"""
获取列表信息
:param sql:
:param args:
:return:
"""
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='weibo', 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:
:param args:
:return:
"""
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='weibo', 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:
:param args:
:return:
"""
conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd='redhat', db='weibo', charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 改为字典
cursor.execute(sql,args)
conn.commit()
cursor.close()
conn.close()

  

students.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>学生列表</h1>
<div>
<a href="/add_students_add/">添加学生</a>
</div>
<table>
<thead>
<tr>
<th>ID</th>
<th>学生姓名</th>
<th>所属班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for students in students_list %}
<tr>
<td>{{ students.sid }}</td>
<td>{{ students.name }}</td>
<td>{{ students.title }}</td>
<td>
<a href="/del_students_del/?sid={{ students.sid }}">删除</a>
|
<a href="/edit_students_edit/?sid={{ students.sid }}">编辑</a>
</td>
</tr>
{% endfor %} </tbody>
</table>
</body>
</html>

  

add_students_add.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>添加学生</h1>
<form method="post" action="/add_students_add/">
<p>学生姓名:<input type="text" name="name" placeholder="please input your name"></p>
<p>所属班级:
<select name="classes_id">
{% for foo in class_list %}
<option value="{{ foo.nid }}">{{ foo.title }}</option>
{% endfor %}
</select>
</p>
<input type="submit" value="submit" >
</form>
</body>
</html>

  

edit_studetns_edit.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>编辑学生</h1>
<form method="post" action="/edit_students_edit/?sid={{ students_name.sid }}">
<p>学生姓名:<input type="text" name="name" value="{{ students_name.name }}"></p>
<p>学生班级:
<select name="classes_id">
{% for row in class_list %}
{% if row.nid == students_name.classes_id %}
<option selected value="{{ row.nid }}">{{ row.title }}</option>
{% else %}
<option value="{{ row.nid }}">{{ row.title }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<input type="submit" value="submit">
</form> </body>
</html>

  

模态对话框添加班级classes:

  模态对话框就是在页面上做两层处理。第一层是遮罩层,第二层是呈现对话框的显示层

  对话框的处理在页面的头《head》里要写样式:

classes.html

<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.hide{
display: none;
}
.shadow{
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: black;
opacity: 0.4;
z-index: 999;
}
.model{
z-index: 1000;
position: fixed;
left: 50%;
top: 50%;
height: 300px;
width: 400px;
background-color: white;
margin-left: -200px;
margin-top: -150px;
}
</style>
</head>

  在《body》里是:

    <div id="shadow" class="shadow "></div>
<div id="model" class="model ">
<form method="post" action="/model_ajax_classes_add/">
<p>添加班级:<input type="text" name="title"></p>
<input type="submit" value="submit">{{ msg }}
</form>
</div>
<script>
function showModal(){
document.getElementById("shadow").classList.remove("hide");
document.getElementById("model").classList.remove("hide");
}
</script>
</body>
</html>

  

  在模态对话框里,用到的form提交方式,期特点是提交页面就刷新。其弊病是在提交数据错误时。也依旧刷新,而不是在当前页面显示错误值。

  比如,在输入空班级时,后端判断不得为0时,form依旧刷新,并没有提示词。

  Form表单的特性就是刷新

    在form表单中,使用form表单,在正常提交跳转是没有问题的,但是bug在于错误提交数据,页面还是会刷新,而不是在原有的页面中反馈错误信息。

    所以,这里就需要用到Ajax操作。

  另建对应单独的执行函数:

views.py

def model_ajax_classes_add(request):
model_ajax_add_classes_title = request.POST.get("title")
if len(model_ajax_add_classes_title)>0:
sqlheper.modify("insert into classes(title) values(%s)",[model_ajax_add_classes_title,])
return redirect("/classes/")
else:
return render(request,"classes.html",{"msg":"班级名称不能为空"})

  

Ajax对话框提交班级信息的实现方式:

  Ajax的特点和知识点:

    特点:Ajax提交,页面不刷新,形象理解为偷偷的提交数据给后端处理

       实现ajax方法,要使用jQuery

    知识点:1、ajax以什么方式提交数据type。

        2、ajax往哪里提交要指定url。

        3、ajax提交什么数据要指定data。

        4、ajax提交成功和失败分别要干什么。

         1-3执行完,会等待。

         data是提交的数据,是字典的类型,values值提交的url中,data{"key":().val()}   val是标定id里输入的值

         success:function(data) 当服务端处理完函数返回数据时,自动调用这个function函数,这里的data是服务端返回的值.

          比如:console.log(data)

 在ajax执行完需要跳转时,是不能自行跳转的,需要些js来实现跳转。在django里用redirect也是实现不了的。

    js的实现就是用location.href = "/url/"

 ajax的执行流程,触发ajax,作为服务端的ajax获取到前端传输的数据data,以字典的value值的形式传给后端服务,当后端收到数据后,给前端一个返回值,执行success的function函数返回前端应该收到的返回值。在前端代码的console里可看到

ajax的班级添加demo示例:

classes.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>classes</title>
<style>
.hide{
display: none;
}
.shadow{
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: black;
opacity: 0.4;
z-index: 999;
}
.modal{
z-index: 1000;
position: fixed;
left: 50%;
top: 50%;
height: 300px;
width: 400px;
background-color: white;
margin-left: -200px;
margin-top: -150px;
}
</style>
</head>
<body>
<h1>classes_list</h1>
<div>
<a href="/add_class/">添加</a>
|
<a onclick="showModal();">对话框添加</a>
|
<a>对话框</a>
</div>
<table>
<thead>
<tr>
<th>ID</th>
<th>班级名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for item in class_lsit %}
<tr>
<td>{{ item.nid }}</td>
<td>{{ item.title }}</td>
<td>
<a href="/del_class/?nid={{ item.nid }}">删除</a>
|
<a onclick="modelEdit();">对话框编辑</a>
|
<a href="/edit_class/?nid={{ item.nid }}">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table> <div id="shadow" class="shadow hide"></div>
<div id="modal" class="modal hide">
<p>添加班级:<input id="title" type="text" name="title" placeholder="班级名称"></p>
<input type="button" value="submit" onclick="AjaxSend();"/>
<input type="button" value="取消" onclick="cancleModal();"/><span id="errormsg"></span>
</div> <script src="/static/jquery-1.12.4.js"></script>
<script>
function showModal() {
document.getElementById("shadow").classList.remove("hide"); //找到遮罩层,并去挑遮罩层
document.getElementById("modal").classList.remove("hide"); } function cancleModal() {
document.getElementById('shadow').classList.add('hide');
document.getElementById('modal').classList.add('hide')
document.getElementById('eidtModal').classList.add('hide')
} function AjaxSend(){
$.ajax({
url:'/modal_add_classes_ajax/', //往哪里提交
type:'POST', //以什么方式提交
data:{"title":$("#title").val()}, //拿到全段输入的值
success:function (data) {
//当服务端处理完成后,返回数据时,该函数自动调用
//data是服务端返回的值
console.log(data);
if(data=="ok"){
location.href='/classes/'; //指定提交成功后跳转到哪里
}else {
$('#errormsg').text(data);
}
}
})
}
</script>
</body>
</html>

  views.py的model_add_classes_ajax函数的操作示例:

def modal_add_classes_ajax(request):
#获取前端的title
title = request.POST.get('title')
print(title)
if len(title) > 0:
sqlheper.modify('insert into classes(title) values(%s)',[title,])
return HttpResponse('ok')
else:
return HttpResponse('班级标题不能为空')

  

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

  

Django之学员管理二的更多相关文章

  1. Django之学员管理一

    Django之学员管理一 建表结构: #班级表class: id title 1 五年一班 2 五年二班 3 五年三班 4 五年四班 #学生表student: id name 班级ID(FK外键) 1 ...

  2. Django之学员管理

    Django之学员管理 实现-------在前端页面提交的数据,后端可直接写入数据库.在页面实现操作数据库的增删改查. 数据表设计:(三个角色四张表) 班级表: id title 1 花果山国小一年级 ...

  3. Django之学员管理三

    Django之学员管理三 web框架的本质: 本质是客户端和服务端的交互.用socket实现. socket客户端(浏览器) 2.发送ip和端口,http://www.baidu.com:80/ind ...

  4. Django之后台管理二

    前面讲到admin界面用户的注册以及修改,如果我们注册的用户密码忘记了该怎么办呢 在终端输入如下的命令进行重置 D:\django_test2>python manage.py shell Py ...

  5. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  6. Django入门实践(二)

    Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...

  7. django模型系统(二)

    django模型系统(二) 常用查询 每一个django模型类,都有一个默认的管理器,objects QuerySet表示数据库中对象的列表.他可以有0到国歌过滤器.过滤器通过给定参数,缩小查询范围( ...

  8. Django中模型(二)

    Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...

  9. Django pymysql学员管理系统

    学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司急需一套方便易用的“学员管理系统”,来提 ...

随机推荐

  1. Cloudera Manager是啥?主要是干啥的?

    简单来说,Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提 ...

  2. java hashCode 作用

    hashCode 作用,对象根据hashCode的值分区域存放 /** * hashCode 作用 * * @author Administrator * */ public class Point ...

  3. Hadoop端口访问

    Hadoop集群默认端口 Hadoop本地开发,9000端口拒绝访问

  4. Chips CodeForces - 333B

    Chips CodeForces - 333B 题意:有一个n*n的棋盘,其中有m个格子被禁止.在游戏开始前要将一些芯片(?)放到四条边上(但不能是角上).游戏开始后,每次操作将每一个芯片移动到它四周 ...

  5. 485 Max Consecutive Ones 最大连续1的个数

    给定一个二进制数组, 计算其中最大连续1的个数.示例 1:输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意:    输入的数组只包 ...

  6. 列表、margin和padding的探讨、标签的分类

    一.列表 列表分为无序列表.有序列表和自定义列表 1.无序列表   <ul></ul> 1).内部必须有子标签,<li></li> 2).ul天生自带内 ...

  7. QQ面板拖拽(慕课网DOM事件探秘)(下)

    2.鼠标事件坐标获取 function fnDown(event) { var event = event || window.event; var oDrag = document.getEleme ...

  8. 【学习笔记】二:在HTML中使用JavaScript

    1.<script>标签 1)考虑到最大限度的浏览器兼容性和约定俗成,type属性使用:text/javascript. 2)标签建议放置到</body>标签前,提高用户体验( ...

  9. 复位电路设计——利用PLL锁定信号(lock)产生复位信号

    利用PLL锁定信号(lock)产生复位信号 在FPGA刚上电的时候,系统所需的时钟一般都要经过PLL倍频,在时钟锁定(即稳定输出)以前,整个系统应处于复位状态.因此,我们可以利用PLL的锁定信号来产生 ...

  10. 【HEVC帧间预测论文】P1.4 Motion Vectors Merging: Low Complexity Prediction Unit Decision

    Motion Vectors Merging: Low Complexity Prediction Unit Decision Heuristic for the inter-Prediction o ...