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. Linux之基础系统优化

    Linux基础系统优化 >>> https://www.cnblogs.com/pyyu/p/9355477.html Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命 ...

  2. error: Libtool library used but 'LIBTOOL' is undefined

    编译时出现: error: Libtool library used but ‘LIBTOOL’ is undefined 参考了一下: http://stackoverflow.com/questi ...

  3. Docker + Nginx + Tomcat 实现负载均衡简单演示

    Docker + Nginx + Tomcat 实现负载均衡 环境 [root@pinyoyougou-docker ~]# docker -v Docker version 1.12.6, buil ...

  4. Git的小疑惑

    ①怎么理解Git clone ssh://...git     和 Git remote add [shortname] [url]:Git fetch [shorename];的区别:为什么已经把远 ...

  5. 爬虫-selenium的使用

    安装 pip install selenium 开始 # coding=utf-8 from selenium import webdriver # 引用selenium库 import time # ...

  6. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  7. CF1245E:Hyakugoku and Ladders

    CF1245E:Hyakugoku and Ladders 题意描述: 给你一个\(10*10\)的矩阵,矩阵描述如下 最开始的时候你在左下角,你的目标是到达左上角. 你可以走路径或者爬梯子. 路径的 ...

  8. Kali系统改国内源配置和SSH配置

    一.Kali系统更新源 使用官网的虚拟化镜像安装,默认为英文界面,更新源也是官方源.因为官方服务器在国外,速度不是很理想,现在就来改国内源并且更新系统. 1.使用编辑器打开系统源文本(在终端内操作,先 ...

  9. md5-js加密

    JS-MD5加密/html页面使用 大家都知道,传输明文信息很不安全,尤其像密码.卡号等这些敏感私密的信息,更不能暴露出去.在这里给大家介绍一种在前端JS中的MD5加密算法(因为要匹配的后台数据是MD ...

  10. centos6中安装新版 Elasticsearch 7.x

    es出新版了,虽然公司里还是用的老版本,但是本地还是有必要自己安装了玩玩 下载地址:https://www.elastic.co/cn/downloads/elasticsearch 那么一般来说还是 ...