Django--多对多表操作+母版

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

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

需求

  1. 对老师表进行增删改查,此时老师表和班级表是多对多关系

步骤

  1. 开始写功能

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

添加路由映射关系

urlpatterns = [
# 新url方式
url(r'^teachers/', teachers),
url(r'^add_teacher/', add_teacher),
url(r'^del_teacher/', del_teacher),
url(r'^update_teacher/', update_teacher),
# ajax方式
url(r'^ajax_add_teacher/', ajax_add_teacher),
url(r'^ajax_update_teacher/', ajax_update_teacher),
]

老师表的增删改查

# students.html -- 通过继承layout.html页面

{% extends 'layout.html' %}

{% block mycss %}
<style>
select {
height: 34px;
width: 203px;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
}
</style>
{% endblock %} {% block mycontent %}
<h3>学生表</h3>
<table class="table table-hover table-bordered">
<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 class="btn btn-info"><a href="/update_student/?id={{ stu.sid }}"
style="color: white;text-decoration: none;">更新</a></button>
<button class="ajax_update btn btn-primary">ajax更新</button>
</td>
<td>
<button class="btn btn-danger"><a href="/del_student/?id={{ stu.sid }}" class="delete"
style="color: white;text-decoration: none;">删除</a></button>
{# <button class="ajax_delete">ajax删除</button>#}
</td>
</tr>
{% endfor %} </tbody>
</table>
<br><br>
<button class="btn btn-info"><a href="/add_student/" style="color: white;text-decoration: none;">添加学生</a></button>
<button id="ajax_add" class="btn btn-primary">ajax添加学生</button> {# 遮罩层 #}
<div class="shadow"></div> {# 弹出框层 #}
{# 增加学生 #}
<div class="add_model">
{# <input type="hidden" name="class_id">#}
<div>
<h4 style="text-align: center; margin-top: 20px;">增加学生</h4>
<hr>
</div>
<div class="model" style="margin-left: 120px">
名字:<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">
{% 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" class="btn btn-danger" style="margin-left: 48px;">添加</button>
<button class="add_cancel btn btn-primary" style="margin-left: 40px;">取消</button>
</div>
</div> {# 更新学生 #}
<div class="update_model">
<div>
<h4 style="text-align: center; margin-top: 20px;">更新学生</h4>
<hr>
</div>
<div class="model" style="margin-left: 120px">
<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">
{% 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" class="btn btn-danger" style="margin-left: 48px;">更新</button>
<button class="up_cancel btn btn-primary" style="margin-left: 48px;">取消</button>
</div>
</div>
{% endblock %} {% block myjs %}
{# 删除学生 #}
<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>
{% endblock %}
# add_student.html -- 通过继承layout.html页面

{% extends 'layout.html' %}

{% block mycss %}
<style>
select {
height: 34px;
width: 203px;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
}
</style>
{% endblock %} {% block mycontent %}
<h3>增加老师</h3>
<form action="/add_teacher/" method="post" class="form-inline">
老师姓名:<input type="text" name="tname" class="form-control"><br>
<div style="margin-top: 2px;margin-bottom: 10px">
班级列表:<select name="cid" id="" multiple>
{% 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="添加" class="btn btn-danger"></span>
<span style="margin-left: 40px;">
<button class="btn btn-primary">
<a href="/teachers/" style="color: white;text-decoration: none;">取消</a>
</button>
</span>
</form>
{% endblock %}
# update_student.html -- 通过继承layout.html页面

{% extends 'layout.html' %}

{% block mycss %}
<style>
select {
height: 34px;
width: 203px;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
}
</style>
{% endblock %} {% block mycontent %}
<h3>更新老师信息</h3>
<form action="/update_teacher/" method="post" class="form-inline">
<input type="hidden" name="tid" value="{{ teacher.id }}">
姓名:<input type=" text" class="form-control" name="tname" value="{{ teacher.tname }}"><br>
<div style="margin-top: 2px;margin-bottom: 10px">
班级:<select name="cid" id="" multiple>
{% 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="更新" class="btn btn-danger"></span>
<span style="margin-left: 40px;">
<button class="btn btn-primary">
<a href="/teachers/" style="color: white;text-decoration: none;">取消</a>
</button>
</span>
</form>
{% endblock %}
# urls.py

@deco
def teachers(request):
sql = 'select teachers.id as tid,tname,cname,cid from teachers left join teacher2class on teachers.id = teacher2class.tid left join classes on classes.id = teacher2class.cid order by tid'
res = mysql(sql)[0]
# print(res) sql = 'select * from classes'
classes = mysql(sql)[0] teachers = {}
# cids = {} for dic in res:
if dic['tid'] in teachers:
teachers[dic['tid']]['cname'].append(dic['cname'])
# cids[dic['tid']]['cids'].append(dic['cid']) else:
teachers[dic['tid']] = {'tid': dic['tid'], 'tname': dic['tname'], 'cname': [dic['cname'], ]}
# cids[dic['tid']] = {'classids': [dic['cid'], ]} return render(request, 'teachers.html', {'teachers': teachers.values(), 'classes': classes}) @deco
def add_teacher(request):
sql = 'select * from classes'
classes = mysql(sql)[0] if request.method == "GET": return render(request, 'add_teacher.html', {'classes': classes}) else:
tname = request.POST.get('tname')
cids = request.POST.getlist('cid') if not (tname and cids):
data = '姓名或班级不能为空'
return render(request, 'add_teacher.html', {'classes': classes, 'data': data}) sql = 'select * from teachers where tname=%s'
res = mysql(sql, (tname,))[0]
if res:
data = '老师已存在'
return render(request, 'add_teacher.html', {'classes': classes, 'data': data}) sql = 'insert into teachers(tname) values(%s)'
mysql(sql, (tname,)) sql = 'select id from teachers where tname=%s'
tid = mysql(sql, (tname,))[0].get('id')
# print(tid)
# print(cids) for cid in cids:
cid = int(cid)
sql = 'insert into teacher2class(tid,cid) values (%s,%s)'
mysql(sql, (tid, cid)) return redirect('/teachers/') @deco
def del_teacher(request):
# print(request)
tid = request.GET.get('id')
# print(tid)
sql = 'delete from teacher2class where tid=%s'
mysql(sql, (tid,)) sql = 'delete from teachers where id=%s'
mysql(sql, (tid,)) return redirect('/teachers/') @deco
def update_teacher(request):
sql = 'select * from classes'
classes = mysql(sql)[0] if request.method == 'GET':
tid = request.GET.get('id')
sql = 'select * from teachers where id=%s'
teacher = mysql(sql, (tid,))[0]
# print(teacher)
return render(request, 'update_teacher.html', {'teacher': teacher, 'classes': classes}) else:
id = request.POST.get('tid')
tname = request.POST.get('tname')
cids = request.POST.getlist('cid') sql = 'select * from teachers where id=%s'
teacher = mysql(sql, (id,))[0] if not (tname and cids):
data = '名字或班级不能为空'
return render(request, 'update_teacher.html', {'teacher': teacher, 'classes': classes, 'data': data}) sql = 'select * from teachers where tname=%s and id != %s'
res = mysql(sql, (tname, id))[0]
if res:
data = f'老师--{tname}--已存在'
return render(request, 'update_teacher.html', {'teacher': teacher, 'classes': classes, 'data': data}) sql = 'delete from teacher2class where tid=%s'
mysql(sql, (id,)) sql = 'update teachers set tname=%s where id=%s '
mysql(sql, (tname, id)) for cid in cids:
cid = int(cid)
sql = 'insert into teacher2class(tid,cid) values(%s,%s)'
mysql(sql, (id, cid)) return redirect('/teachers/')

ajax操作老师表

# urls.py

@deco
def ajax_add_teacher(request):
tname = request.POST.get('tname')
cids = request.POST.getlist('cid') res = {'code': None, 'msg': None} if not (tname and cids):
res['code'] = 10001
res['msg'] = '姓名或班级不能为空'
return HttpResponse(json.dumps(res)) sql = 'select * from teachers where tname=%s'
resp = mysql(sql, (tname,))[1]
if resp:
res['code'] = 10001
res['msg'] = f'老师---{tname}-已存在'
return HttpResponse(json.dumps(res)) sql = 'insert into teachers(tname) values(%s)'
mysql(sql, (tname,))
sql = 'select id from teachers where tname=%s'
tid = mysql(sql, (tname,))[0].get('id')
# tid = mysql(sql, (tname,))[0]
print(tid)
for cid in cids:
cid = int(cid)
sql = 'insert into teacher2class(tid,cid) values (%s,%s)'
mysql(sql, (tid, cid)) res['code'] = 10000
res['msg'] = f'老师--{tname}--信息添加成功'
return HttpResponse(json.dumps(res)) @deco
def ajax_update_teacher(request):
id = request.POST.get('id')
tname = request.POST.get('tname')
cids = request.POST.getlist('cid') res = {'code': None, 'msg': None}
if not (tname and cids):
res['code'] = 10001
res['msg'] = '名字或班级不能为空'
return HttpResponse(json.dumps(res)) sql = 'select * from teachers where tname=%s and id!=%s'
resp = mysql(sql, (tname, id))[0]
if resp:
res['code'] = 10001
res['msg'] = '老师已存在'
return HttpResponse(json.dumps(res)) sql = 'delete from teacher2class where tid=%s'
mysql(sql, (id,)) sql = 'update teachers set tname=%s where id=%s '
mysql(sql, (tname, id)) for cid in cids:
cid = int(cid)
sql = 'insert into teacher2class(tid,cid) values(%s,%s)'
mysql(sql, (id, cid)) res['code'] = 10000
res['msg'] = f'老师--{tname}--更新成功'
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多对多表的三种创建方式,MTV与MVC概念

    MTV与MVC MTV模型(django): M:模型层(models.py) T:templates V:views MVC模型: M:模型层(models.py) V:视图层(views.py) ...

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

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

随机推荐

  1. 动态加载swiper,默认显示最后一个swiper-slide解决方案???

    问题描述: 用ajax动态加载swiper-slide以后,由于我是自适应屏幕的尺寸来决定一屏显示多少图片,所以加了 slidesPerView:'auto'这条属性,加了这条属性过后,每次刷新页面的 ...

  2. 搜索 - 广度优先搜索(BFS)普通模板

    bfs广度优先搜索模板 本人蒟蒻,为响应号召 写下bfs模板一篇 可以适用于求最短步数,等最优解问题.如有不足或者不对的地方请各位大佬及时指出 ^-^ 欢迎来戳 具体实现代码(C++) 各个模块功能和 ...

  3. Java 为什么需要包装类,如何使用包装类?

    出处:https://cloud.tencent.com/developer/article/1362754

  4. JAVA并发-同步器AQS

    什么是AQS aqs全称为AbstractQueuedSynchronizer,它提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReentrantLo ...

  5. V2X:

    一篇文章读懂V2X系列:标准篇 为了提升交通系统的安全性和智能化,智能交通系统的概念正逐渐兴起.智能交通可以利用新一代的通信网络和数据处理能力,提高现有交通系统的整体效率,降低能量损耗,增加运输的安全 ...

  6. 【转】SkipList跳表基本原理

    增加了向前指针的链表叫作跳表.跳表全称叫做跳跃表,简称跳表.跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表.跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找.跳表不仅 ...

  7. 第02组 Alpha冲刺(3/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 学习如何评估代码质量 准备Al ...

  8. 【BigData】Java基础_类和对象的基本使用

    1.需求描述 ①定义一个学生类,然后根据该类创建3个具体的学生对象 类中包含信息:学生姓名.学号.年龄.性别.所在地址 ②将这三个学生对象存入到数组中 ③然后将数组对象按照学生的年龄倒序排序 2.代码 ...

  9. nmap简单使用方法

    1.作用扫描整个网络的主机服务状态和存活优点,快速,准确,效率高2.nmap 选项 Usage: nmap [Scan Type(s)] [Options] {target specification ...

  10. html页面添加左侧滑动菜单与内容部分的滚动条

    html + css + jquery 展示地址:https://migloo.gitee.io/front  或 https://www.igloo.xin/front 思路: 1.通过jquery ...