Django--一对多表操作

今天还以一个学生管理系统为例,先通过pymysql这个模块,进行一对多表操作,有以下两种方式

  1. 新url的方式:直接新开一个页面进行操作
  2. ajax模态框的方式:在本页面通过模态框的方式进行操作

需求

  1. 对学生表进行增删改查

步骤

  1. 开始写功能

    1. 添加路由
    2. 设计模板
    3. 写对应的接口函数

添加路由映射关系

urlpatterns = [
# 新url方式
url(r'^students/', students),
url(r'^add_student/', add_student),
url(r'^del_student/', del_student),
url(r'^update_student/', update_student),
# ajax方式
url(r'^ajax_add_student/', ajax_add_student),
url(r'^ajax_update_student/', ajax_update_student),
]

学生表的增删改查

# students.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生表</title>
<style>
a {
color: black;
text-decoration: none;
} .shadow {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: black;
opacity: 0.4;
display: none;
} .add_model, .update_model {
position: fixed;
height: 300px;
width: 500px;
left: 500px;
top: 100px;
background-color: white;
display: none;
} .model {
margin-top: 20px;
margin-left: 40px;
} </style>
</head>
<body>
<h2>学生表</h2>
<table border="1" cellspacing="0">
<tbody>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>班级</th>
<th>更新</th>
<th>删除</th>
</tr>
{% for stu in students %}
<tr>
<td>{{ stu.sid }}</td>
<td>{{ stu.name }}</td>
<td>{{ stu.age }}</td>
<td clsid="{{ stu.cid }}">{{ stu.cname }}</td>
<td>
<button><a href="/update_student/?id={{ stu.sid }}">更新</a></button>
<button class="ajax_update">ajax更新</button>
</td>
<td>
<button><a href="/del_student/?id={{ stu.sid }}" class="delete">删除</a></button>
{# <button class="ajax_delete">ajax删除</button>#}
</td>
</tr>
{% endfor %} </tbody>
</table>
<br><br>
<button><a href="/add_student/" target="_blank">添加学生</a></button>
<button id="ajax_add">ajax添加学生</button> </body>
</html>
# add_student.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加学生</title>
<style>
a {
color: black;
text-decoration: none;
}
</style>
</head>
<body>
<h2>增加学生</h2>
<form action="/add_student/" method="post">
姓名:<input type="text" name="sname"><br>
年龄:<input type="text" name="sage"><br>
<div style="margin-top: 2px;margin-bottom: 10px">
班级:<select name="cid" id="" style="width: 166px; height: 21.5px">
{% for class in classes %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endfor %}
</select>
</div>
<span style="color:red; font-size: 12px;">{{ data }}</span><br>
<span style="margin-left: 48px;"><input type="submit" value="添加"></span>
<span style="margin-left: 40px;"><button><a href="/students/">取消</a></button></span>
</form>
</body>
</html>
# uodate_student.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生信息更新</title>
<style>
a {
color: black;
text-decoration: none;
}
</style>
</head>
<body>
<h2>更新学生信息</h2>
<form action="/update_student/" method="post">
<input type="hidden" name="sid" value="{{ student.id }}">
姓名:<input type=" text" name="sname" value="{{ student.name }}"><br>
年龄:<input type="text" name="sage" value="{{ student.age }}"><br>
<div style="margin-top: 2px;margin-bottom: 10px">
班级:<select name="cid" id="" style="width: 166px; height: 21.5px">
{% for class in classes %}
{% if student.cid == class.id %}
<option value="{{ class.id }}" selected>{{ class.cname }}</option>
{% else %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endif %}
{% endfor %}
</select></div>
<span style="color:red; font-size: 12px;">{{ data }}</span><br>
<span style="margin-left: 48px;"><input type="submit" value="更新"></span>
<span style="margin-left: 40px;"><button><a href="/students/">取消</a></button></span>
</form>
</body>
</html>
# urls.py

# 获取学生信息
@deco
def students(request):
sql = 'select students.id as sid,name,age,classes.id as cid,cname from students left join classes on students.cid = classes.id order by sid'
students = mysql(sql)[0] sql = 'select * from classes'
classes = mysql(sql)[0] return render(request, 'students.html', {'students': students, 'classes': classes}) # 添加学生
@deco
def add_student(request):
sql = 'select * from classes'
classes = mysql(sql)[0] if request.method == 'GET':
return render(request, 'add_student.html', {'classes': classes}) else:
sname = request.POST.get('sname')
age = request.POST.get('sage')
cid = request.POST.get('cid') if not (sname and age):
data = "姓名年龄不能为空"
return render(request, 'add_student.html', {'data': data, 'classes': classes}) sql = 'select * from students where name=%s'
res = mysql(sql, (sname,))[0]
if res:
data = "姓名已存在"
return render(request, 'add_student.html', {'data': data, 'classes': classes}) sql = 'insert into students(name,age,cid) values(%s,%s,%s)'
mysql(sql, (sname, age, cid))
return redirect('/students/') # 更新学生信息
@deco
def update_student(request):
sql = 'select * from classes'
classes = mysql(sql)[0] if request.method == "GET":
id = request.GET.get('id')
# print(id)
s_sql = 'select * from students where id=%s'
student = mysql(s_sql, (id,))[0] return render(request, 'update_student.html', {'student': student, 'classes': classes})
else:
id = request.POST.get('sid')
name = request.POST.get('sname')
age = request.POST.get('sage')
cid = request.POST.get('cid') s_sql = 'select * from students where id=%s'
student = mysql(s_sql, (id,))[0] if not (name and age):
data = "姓名或年龄不能为空"
return render(request, 'update_student.html', {'student': student, 'classes': classes, 'data': data}) sql = 'select * from students where name=%s and age=%s and cid=%s'
res = mysql(sql, (name, age, cid))[0]
if res:
data = "学生信息已存在"
return render(request, 'update_student.html', {'student': student, 'classes': classes, 'data': data}) sql = 'update students set name=%s,age=%s,cid=%s where id=%s'
mysql(sql, (name, age, cid, id))
return redirect('/students/') # 删除学生信息
@deco
def del_student(request):
id = request.GET.get('id')
# print(id)
sql = "delete from students where id=%s"
mysql(sql, (id,)) return redirect('/students/')

ajax更新和添加

# students.html

<!--直接加在students.html页面里面-->
{# 遮罩层 #}
<div class="shadow"></div> {# 弹出框层 #}
{# 增加学生 #}
<div class="add_model">
{# <input type="hidden" name="class_id">#}
<div class="model">
名字:<input type="text" name="name" id="add_student"><br>
年龄:<input type="text" name="age" id="add_age"><br>
<div style="margin-top: 2px;margin-bottom: 2px">
班级:<select name="add_cid" id="add_cid" style="width: 166px; height: 21.5px">
{% for class in classes %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endfor %}
</select></div>
<span id="add_error" style="color:red; font-size: 12px; margin-bottom: 10px;"></span><br>
<button id="add" style="margin-left: 48px;">添加</button>
<button class="add_cancel" style="margin-left: 40px;">取消</button>
</div>
</div> {# 更新学生 #}
<div class="update_model">
<div class="model">
<input type="hidden" name="sid" id="up_sid">
姓名:<input type="text" name="name" id="up_name"><br>
年龄:<input type="text" name="age" id="up_age">
<div style="margin-top: 2px;margin-bottom: 2px">
班级:<select name="up_cid" id="up_cid" style="width: 166px; height: 21.5px">
{% for class in classes %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endfor %}
</select>
</div>
<span id="up_error" style="color:red; font-size: 12px; margin-bottom: 10px;"></span><br>
<button id="update" style="margin-left: 48px;">更新</button>
<button class="up_cancel" style="margin-left: 48px;">取消</button>
</div>
</div> {# CDN导入jQuery #}
<script
src="http://code.jquery.com/jquery-1.12.4.min.js"
integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ="
crossorigin="anonymous"></script> {# 删除学生 #}
<script>
$('.delete').click(function () {
res = window.confirm('是否删除学生');
return res;
});
</script> {# 增加学生 #}
<script>
$('#ajax_add').click(function () {
$('.shadow, .add_model').css('display', 'block');
{#$('.shadow, .add_model').show()#}
}); $('.add_cancel').click(function () {
$('.shadow, .add_model').hide();
window.location.href='/students/'
}); $('#add').click(function () {
var name = $('#add_student').val();
var age = $('#add_age').val();
var cid = $('#add_cid').val();
{#console.log(classname);#}
$.ajax({
type: 'POST',
url: '/ajax_add_student/',
data: {'name': name,'age':age,'cid':cid},
success: function (data) {
var res = JSON.parse(data); if (res['code'] == 10000) {
alert(res['msg']);
window.location.href = '/students/';
} else {
$('#add_error').text(res['msg']);
}
}
})
}); </script> {# 更新学生 #}
<script>
$('.ajax_update').click(function () {
$('.shadow, .update_model').show();
var info = $(this).parent().prevAll();
{#console.log(info)#}
var age = info[1].innerText;
var name = info[2].innerText;
var id = info[3].innerText;
var cid = $(info[0]).attr('clsid'); $('#up_age').val(age);
$('#up_name').val(name);
$('#up_sid').val(id);
$('#up_cid').val(cid);
}); $('.up_cancel').click(function () {
$('.shadow, .update_model').hide();
window.location.href = '/students/';
}); $('#update').click(function () {
var name = $('#up_name').val();
var age = $('#up_age').val();
var id = $('#up_sid').val();
var cid = $('#up_cid').val();
{#console.log(classname,id);#} $.ajax({
type: 'POST',
url: '/ajax_update_student/',
data: {'id':id,'name': name, 'age': age,'cid': cid},
success: function (data) {
var res = JSON.parse(data);
if (res['code'] == 10000) {
alert(res['msg']);
window.location.href = '/students/';
} else {
$('#up_error').text(res['msg']);
}
}
})
}); </script>
# urls.py

# ajax增加学生
@deco
def ajax_add_student(request):
name = request.POST.get('name')
age = request.POST.get('age')
cid = request.POST.get('cid') res = {'code': None, 'msg': None}
if not (name and age):
res['code'] = 10001
res['msg'] = '姓名年龄不能为空'
return HttpResponse(json.dumps(res)) sql = 'select * from students where name=%s and age=%s and cid=%s '
resp = mysql(sql, (name, age, cid))[0]
if resp:
res['code'] = 10001
res['msg'] = f'学生--{name}--已存在'
return HttpResponse(json.dumps(res)) sql = 'insert into students(name,age,cid) values(%s,%s,%s)'
mysql(sql, (name, age, cid))
res['code'] = 10000
res['msg'] = f'学生--{name}--信息添加成功'
return HttpResponse(json.dumps(res)) # ajax更新学生
@deco
def ajax_update_student(request):
id = request.POST.get('id')
name = request.POST.get('name')
age = request.POST.get('age')
cid = request.POST.get('cid') res = {'code': None, 'msg': None}
if not (name and age):
res['code'] = 10001
res['msg'] = '姓名年龄不能为空'
return HttpResponse(json.dumps(res)) sql = 'select * from students where name=%s and age=%s and cid=%s '
resp = mysql(sql, (name, age, cid))[0]
if resp:
res['code'] = 10001
res['msg'] = f'学生--{name}--已存在'
return HttpResponse(json.dumps(res)) sql = "update students set name=%s,age=%s,cid=%s where id=%s"
mysql(sql, (name, age, cid, id)) res['code'] = 10000
res['msg'] = f'学生--{name}--信息更新成功'
return HttpResponse(json.dumps(res))

Django--一对多表操作的更多相关文章

  1. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  2. sqlalchemy模块介绍、单表操作、一对多表操作、多对多表操作、flask集成.

    今日内容概要 sqlalchemy介绍和快速使用 单表操作增删查改 一对多 多对多 flask集成 内容详细 1.sqlalchemy介绍和快速使用 # SQLAlchemy是一个基于 Python实 ...

  3. Django models多表操作

    title: Django models多表操作 tags: Django --- 多表操作 单独创建第三张表的情况 推荐使用的是使用values/value_list,selet_related的方 ...

  4. Django ORM多表操作

    多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...

  5. Django之ORM表操作

    ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import models def ...

  6. django第8天(在测试文件中运行django项目|单表操作)

    django第8天 在测试文件中运行django项目 1.将项目配置文件数据库该为mysql,修改配置信息 PORT = '127.0.0.1' DATABASES = { 'default': { ...

  7. Django day08 多表操作 (二) 添加表记录

    一: 一对多 1. 一对多新增 两种方式:  publish = 对象    publish_id = id 1. publish_id 和 publish 的区别就是: 1)publish_id 可 ...

  8. Django day08 多表操作 (四) 一对多, 多对多连续跨表查询

    一对多 # 基于双下划线的一对多查询 # 查询出版社为上海出版社的所有图书 # ret = Publish.objects.filter(name='上海出版社').values('book__nam ...

  9. Django数据库数据表操作

    建立表单 django通过设置类来快速建表,打开models.py 例: from __future__ import unicode_literals from django.db import m ...

  10. django ORM单表操作

    1.ORM介绍 ORM是“对象-关系-映射”的简称 映射关系: mysql---------Python 表名----------类名 字段----------属性 表记录--------实例化对象 ...

随机推荐

  1. Android Studio总结

    课程背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源项目都已经在采用,G ...

  2. vue - 基础(3)

    1.数据的双向绑定 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  3. 安装glibc

    wget http://ftp.gnu.org/gnu/glibc/glibc-2.23.tar.gztar -zxvf glibc-2.23.tar.gz cd glibc-2.23 mkdir b ...

  4. 201671010447 杨露露 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 总结这学期软件工程学习获得 一 ...

  5. [PHP] Laravel 5.5 图片上传功能

    以Laravel 5.5 框架为主,进行文件上传功能的实现如下: 一.配置文件修改 打开 config/filesystems.php 文件在 ‘disks’ 数组中添加如下代码 //自定义 'upl ...

  6. Spring Data学习中心

    Spring Data 概览 Spring Data的使命是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特殊特性. 它使数据访问技术,关系数据库和非关系数据库,map ...

  7. 【贪心】【P5521】[yLOI2019] 梅深不见冬

    B [yLOI2019] 梅深不见冬 Background 风,吹起梅岭的深冬:霜,如惊涛一样汹涌:雪,飘落后把所有烧成空, 像这场,捕捉不到的梦. 醒来时已是多年之久,宫门铜环才长了铁锈, 也开始生 ...

  8. 设置 npm 源为淘宝镜像

    淘宝 npm 网址 https://npm.taobao.org/ 修改 npm config set registry http://registry.npm.taobao.org/ 还原 npm ...

  9. centos gcc编译

    centos上面的gcc是4.x的,因为我们使用了c++17,所以想升级成最新的gcc 1. 下载源码 https://gcc.gnu.org/index.html 2. 下载下来是.tar.xz,因 ...

  10. 【技术博客】Postman接口测试教程 - 环境、附加验证、文件上传测试

    Postman接口测试教程 - 环境.附加验证.文件上传测试 v1.0 作者:ZBW 前言 继利用Postman和Jmeter进行接口性能测试之后,我们发现Postman作为一款入门容易的工具,其内置 ...