Django之学员管理二
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之学员管理二的更多相关文章
- Django之学员管理一
Django之学员管理一 建表结构: #班级表class: id title 1 五年一班 2 五年二班 3 五年三班 4 五年四班 #学生表student: id name 班级ID(FK外键) 1 ...
- Django之学员管理
Django之学员管理 实现-------在前端页面提交的数据,后端可直接写入数据库.在页面实现操作数据库的增删改查. 数据表设计:(三个角色四张表) 班级表: id title 1 花果山国小一年级 ...
- Django之学员管理三
Django之学员管理三 web框架的本质: 本质是客户端和服务端的交互.用socket实现. socket客户端(浏览器) 2.发送ip和端口,http://www.baidu.com:80/ind ...
- Django之后台管理二
前面讲到admin界面用户的注册以及修改,如果我们注册的用户密码忘记了该怎么办呢 在终端输入如下的命令进行重置 D:\django_test2>python manage.py shell Py ...
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- Django入门实践(二)
Django入门实践(二) Django模板简单实例 上篇中将html写在了views中,这种混合方式(指Template和views混在一起)不适合大型开发,而且代码不易管理和维护,下面就用Djan ...
- django模型系统(二)
django模型系统(二) 常用查询 每一个django模型类,都有一个默认的管理器,objects QuerySet表示数据库中对象的列表.他可以有0到国歌过滤器.过滤器通过给定参数,缩小查询范围( ...
- Django中模型(二)
Django中模型(二) 三.定义模型 1.模型.属性.表.字段间的关系: 一个模型类在数据库中对应一张表:在模型类中定义的属性,对应该模型对照表中的字段. 2.定义属性 A.概述 ·django根据 ...
- Django pymysql学员管理系统
学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司急需一套方便易用的“学员管理系统”,来提 ...
随机推荐
- TCP协议深度刨析
这篇文章主要是详细说明TCP的拥塞控制,因为它对于我们理解整个TCP/IP协议栈非常重要,但我个人能力有限,其中引用了很多网上其他博主的文章,在下文引用处都有说明,主要是让整篇文章能够连贯,不至于让所 ...
- “XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题
“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs ...
- Swift @objcMembers
使用@objcMembers关键字,将类中的所有方法暴露给Objc (效果等同于为所有方法加上@objc). 示例代码: @objcMembers class MyController: UIView ...
- Mike and gcd problem CodeForces - 798C
题目 (智商题 or 糟心的贪心) 题意: 有一个数列a1,a2,...,an,每次操作可以将相邻的两个数x,y变为x-y,x+y,求最少的操作数使得gcd(a1,a2,...,an)>1.gc ...
- 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度.例如,给出 [100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4].返回所求长度: 4.要求你的算法复杂度为 O ...
- ubuntu16.04里如何正确添加用root用户来登录图形界面(图文详解)
不多说,直接上干货! Ubuntu版本都默认不允许使用root登录,必须要改配置文件. 第一步: 首先设置root密码,利用现有管理员帐户登陆Ubuntu,在终端执行命令:sudo passwd ro ...
- js去掉数组的空字符串
后台返回数据的时候,有些数据为空时,一般都不进行显示,需要去除空字符串. 基本思路:获取数组张度,遍历数组,当数组某个值等于‘’或null或数据类型为undefined时,根据splice方法去除数据 ...
- 【前端】jq弹出一个透明小提示窗,然后逐渐消失
function show_main(content) { var showWindow = '<div id="show_main" style="borde ...
- Asp.Net MVC中捕捉错误路由并设置默认Not Found页面。
在Global中写一个Application_Error捕捉错误路由并重定向到Not Found页面.这里是全局性抓取错误路由,此处还可以写由错误路由导致访问失败的日志记录. protected vo ...
- AJPFX谈JAVA新手问题之异常处理使用不当
★空的 catch 语句块 犯这种错误的人比较少,一般发生在刚学会 Java 或者刚参加工作不久的人身上. 所谓“空 catch 语句块”就是在 catch 语句块中没有对异常作任何处理(比如记错误日 ...