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. java笔记1:准备工作:java历史、Java环境、java编辑器、cmd常用命令

    java的历史 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称. 由James Gosling和同事们共同研发,并在1995年正 ...

  2. RobotFramework自动化测试框架(3)- RobotFramework扩展测试库、资源文件、变量文件

    扩展测试库 扩展测试库可使用python或java语言编写.后直接导入需要使用的测试用例文件即可. 具体的实现和操作,后续补充.请参考官网. 资源文件 在资源文件中定义用户关键字,它提供了共享机制,即 ...

  3. UvaLive6441(期望概率dp)

    1.涉及负数时同时维护最大和最小,互相转移. 2.考场上最大最小混搭转移WA,赛后发现如果是小的搭小的,大的搭大的就可过,类似这种: db a = (C[i] - W[i]) * dp1[i - ][ ...

  4. Headmaster's Headache UVA - 10817

    UVA-10817 ans[i][s1][s2]表示考虑前i个人时,有至少1人教的科目集合为s1,有至少2人教的科目集合为s2时的最少工资集合用一个数字表示,转换成二进制后从后面开始数第i位的状态(1 ...

  5. stack(单调栈) POJ 2082 Terrible Sets

    题目传送门 题意:紧贴x轴有一些挨着的矩形,给出每个矩形的长宽,问能组成的最大矩形面积为多少 分析:用堆栈来维护高度递增的矩形,遇到高度小的,弹出顶部矩形直到符合递增,顺便计算矩形面积,且将弹出的宽度 ...

  6. P3717 [AHOI2017初中组]cover

    题目背景 以下为不影响题意的简化版题目. 题目描述 一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到. 输入输出格式 输入格式: 第一行3个整数n,m, ...

  7. css实现行内文字垂直居中

    之前本人一直使用浮动.相对定位.绝对定位和display:table等css的方法进行定位.网上得知flex可实现弹性布局,符合未来发展趋势,随尝试. 1:让盒子行内文字垂直居中,解决思路是讲文字的行 ...

  8. win10忘记wifi记录

    1.点击桌面右下角无线图标 2.点击网络设置 3.点击管理WIFI设置 4.点击要管理的账户,忘记或者共享该wifi.

  9. SDUT_2146:最小子序列和

    题目描述 给你一个长为n(10<=n<=10000)的数组,数组中的每一个数大于等于1小于等于1000000.请你找出一个长为k(1<=k<=1000)的子序列.找序列时,假如 ...

  10. Android主题更换换肤

    知识总览android主题换肤通常借助LayoutInflater#setFactory实现换肤. 换肤步骤: 通过解析外部的apk压缩文件,创建自定义的Resource对象去访问apk压缩文件的资源 ...