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. Java八大排序之基数排序

    基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分 ...

  2. @TableId

    描述:主键注解 属性 类型 必须指定 默认值 描述 value String 否 "" 主键字段名 type Enum 否 IdType.NONE 主键类型 #IdType 值 描 ...

  3. flask实战-个人博客-编写博客前台

    编写博客前台 博客前台需要开放给所有用户,这里包括显示文章列表.博客信息.文章内容和评论等功能功能. 分页显示文章列表 为了在主页显示文章列表,我们要先在渲染主页模板的index视图的数据库中获取所有 ...

  4. HDU - 5126: stars (求立方体内点数 CDQ套CDQ)

    题意:现在给定空空的三维平面,有加点操作和询问立方体点数. 思路:考虑CDQ套CDQ.复杂度是O(NlogN*logN*logN),可以过此题. 具体的,这是一个四维偏序问题,4维分别是(times, ...

  5. PassArrayByCopy_test.php

    <?php //PassArrayByCopy_test.php $a=array("a","b","c"); function te ...

  6. JDOJ 2175: 忠诚2

    JDOJ 2175: 忠诚2 题目传送门 Description 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让 ...

  7. [51nod1227]平均最小公倍数(莫比乌斯反演+杜教筛)

    题意 求 $\sum_{i=a}^b \sum_{j=1}^i \frac{lcm(i,j)}{i}$. 分析 只需要求出前缀和, $$\begin{aligned}\sum_{i=1}^n \sum ...

  8. html--前端css常用属性

    1.颜色属性 <div style="color:blueviolet">ppppp</div> 输入颜色英文单词 <div style=" ...

  9. c博客作业-数组

    0. 1.本章学习总结 1.1学习内容总结 1.1.1一维数组 1.一般定义形式:类型名 数组名 [数组长度];类型名指定数组中每个元素的类型,数组名是数组变量的名称,是一个合法的标识符,数组长度是一 ...

  10. BAT脚本入门

    BAT脚本入门 echo:显示命令后的字符 chcp 65001: 就是换成UTF-8代码页 echo off: 此语句后的所有运行命令都不显示命令行语句 @:与echo off相似,但它加在每个命令 ...