Django--多对多表操作+母版
今天还以一个学生管理系统为例,先通过pymysql这个模块,进行多对多表操作,以下两种方式
新url的方式:直接新开一个页面进行操作
ajax模态框的方式:在本页面通过模态框的方式进行操作
需求
对老师表进行增删改查,此时老师表和班级表是多对多关系
步骤
开始写功能
添加路由
设计模板
写对应的接口函数
添加路由映射关系
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 %}
select {
height: 34px;
width: 203px;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
}
{% endblock %}
{% block mycontent %}
学生表
ID | 姓名 | 年龄 | 班级 | 更新 | 删除 |
---|
{% for stu in students %}
{{ stu.sid }}{{ stu.name }}{{ stu.age }}{{ stu.cname }}style="color: white;text-decoration: none;">更新
ajax更新
style="color: white;text-decoration: none;">删除
{# ajax删除#}
{% endfor %}
ajax添加学生
{# 遮罩层 #}
{# 弹出框层 #}
{# 增加学生 #}
{# #}
增加学生
名字:
年龄:
班级:
{% for class in classes %}
{{ class.cname }}
{% endfor %}
添加
取消
{# 更新学生 #}
更新学生
姓名:
年龄:
班级:
{% for class in classes %}
{{ class.cname }}
{% endfor %}
更新
取消
{% endblock %}
{% block myjs %}
{# 删除学生 #}
$('.delete').click(function () {
res = window.confirm('是否删除学生');
return res;
});
{# 增加学生 #}
$('#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']);
}
}
})
});
{# 更新学生 #}
$('.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']);
}
}
})
});
{% endblock %}
# add_student.html -- 通过继承layout.html页面
{% extends 'layout.html' %}
{% block mycss %}
select {
height: 34px;
width: 203px;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
}
{% endblock %}
{% block mycontent %}
增加老师
老师姓名:
班级列表:
{% for class in classes %}
{{ class.cname }}
{% endfor %}
{{ data }}
{% endblock %}
# update_student.html -- 通过继承layout.html页面
{% extends 'layout.html' %}
{% block mycss %}
select {
height: 34px;
width: 203px;
padding: 6px 12px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
}
{% endblock %}
{% block mycontent %}
更新老师信息
姓名:
班级:
{% for class in classes %}
{{ class.cname }}
{% endfor %}
{{ data }}
{% 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))