django orm插入一条_【实战演练】Python+Django网站开发系列10-课程选课与退选业务逻辑添加...

news/2024/5/20 22:20:46/文章来源:https://blog.csdn.net/weixin_39816141/article/details/111624078

#本文欢迎转载,转载请注明出处和作者

课程选课页面,会用到查询后台数据库信息并且返回给前端展示,然后前端有按钮可以点击需要选修的课程,然后返回给后台写入数据库记录。是之前08、09的两篇的实际应用案例:

Python+Django网站开发系列08-JavaScript/JQuery前后端交互​zhuanlan.zhihu.com
Python+Django网站开发系列09-django前端展示后台数据​zhuanlan.zhihu.com

1、课程选课页面展示

依然在magicbox里面选取表格组件,这次我们选择一个带按钮的表格样式,方便后面做选课,然后复制代码粘贴到stuinfo/tchinfo的html页面。(就是<table>标签里面的内容)

a5cb52af38499c1bbaa41f1753f00339.png
{% extends 'BASE02.html' %}{% block content %}<table class="table table-bordered table7_demo"><thead><tr><th>课程ID</th><th>课程名称</th><th>学分</th><th>上课时间</th><th>上课地点</th><th>操作</th></tr></thead><tbody><tr>{% for i in courseinfo %}<td>{{ i.cno }}</td><td>{{ i.cname }}</td><td>{{ i.ccredit }}</td><td>{{ i.ctime }}</td><td>{{ i.cplace }}</td><td><button class="btn btn-xs btn-success" title="激活"><i class="glyphicon glyphicon-ok"></i></button><button class="btn btn-xs btn-danger" title="删除"><i class="glyphicon glyphicon-remove"></i></button></td></tr>{% endfor %}</tbody></table>
{% endblock %}

函数增加查询后台数据库表全部数据,并且返回给前端页面。

def selcourse(request):courseinfo = course.objects.all()return render_to_response('selcourse.html',locals())

效果如下:

22dab0363e1f67531e2f7f9a73f2e34f.png

2、按钮点击JS

2.1选课按钮业务逻辑

选课按钮的业务逻辑,有了前面的基础,就非常好弄了,与之前修改密码一样,通过JS进行编写,编写stumgrjs.js文件,增加addcourse函数。(也是通过.post向后台推送数据)

JS函数,注意也需要带参数输入,括号里面有个参数,将课程ID推送到selcourse后台函数。

function addcourse(cno) {$.post('/selcourse/', {'cno':cno,}, function (res) {if(res.result){alert("选课成功!");window.location.reload();}else{alert("选课失败!");window.location.reload();}}, 'json')
}

修改selcourse业务逻辑:这里涉及ORM查询数据库操作,而且课程表(course)与学生表(course)之间是没有直接关联的,是通过中间表-成绩表(score)进行关联的,所以需要插入数据的是score表。

def selcourse(request):if request.method == 'POST' and request.POST:cno = request.POST['cno']username = request.session['username']user = student.objects.get(username=username)sno = user.snoscore.objects.create(cno_id=cno,sno_id=sno)result = Truereturn JsonResponse({'result': result})courseinfo = course.objects.all()return render_to_response('selcourse.html',locals())

先查询当前登录用户的sno,然后cno与sno一切写入score表,创建一条数据,注意当前score表里面的sno叫sno_id,cno叫cno_id,因为是外键引用,所以会自动改了字段名。

前端selcourse.html页面按钮编辑:与之前的onclick唯一的区别,就是调用的js函数可以带参数将'{{ i.cno }}'输入到JS函数,然后JS将cno这个id字段通过post返回给后台,这样后台就能够知道是要选修哪一门课程了。

<button class="btn btn-xs btn-success" title="激活" onclick="addcourse('{{ i.no }}',)">

53ed6026d286109d8f35049278bc96c3.png

但是当前的业务逻辑存在Bug,1是同一个的课程可以多次选修,2是每个人可以无限选修课程。需要继续优化业务逻辑。

def selcourse(request):if request.method == 'POST' and request.POST:cno = request.POST['cno']username = request.session['username']user = student.objects.get(username=username)sno = user.sno# 判断当前课程是否已经选修selected = score.objects.filter(cno_id=cno,sno_id=sno)# 技术已选课程数量,counted.count()直接统计数字counted = score.objects.filter(sno_id=sno)if selected:result = '课程已选修,请勿重复选择!'return JsonResponse({'result': result})elif counted.count() >=2:result = '已达到最大选修课程数量!'return JsonResponse({'result': result})else:#选课成功,写入数据库score.objects.create(cno_id=cno,sno_id=sno)result = 'True'return JsonResponse({'result': result})courseinfo = course.objects.all()return render_to_response('selcourse.html',locals())

JS代码返回的显示内容适度修改:

function addcourse(cno) {$.post('/selcourse/', {'cno':cno,}, function (res) {if(res.result=='True'){alert("选课成功!");window.location.reload();}else{alert(res.result);window.location.reload();}}, 'json')
}

最终效果如下,重复选课提示已选,选修超过2门课程提示超过最大数量,选课成功提示成功。

a3c46626ea60a309e1c9eae18fbbaf40.png

ca8803ed9f024e5374c175f67b1ebc4f.png

53ed6026d286109d8f35049278bc96c3.png

2.2已选课程删除

同样删除按钮需要使用js向后端传输课程号,html按钮绑定delcourse的js函数,后台业务逻辑函数调用ORM的delete命令进行删除。

JS函数编辑:我们还是采用同样的.post向后台推送数据。

function delcourse(cno) {$.post('/delcourse/', {'cno':cno,}, function (res) {if(res.result=='True'){alert("删除成功!");window.location.reload();}else{alert(res.result);window.location.reload();}}, 'json')
}

编辑views.py业务逻辑:单独增加一个删除函数。

def delcourse(request):if request.method == 'POST' and request.POST:cno = request.POST['cno']username = request.session['username']user = student.objects.get(username=username)sno = user.sno# 判断当前要删除的课程是否已选择selected = score.objects.filter(cno_id=cno,sno_id=sno)if selected:score.objects.filter(cno_id=cno,sno_id=sno).delete()result = 'True'return JsonResponse({'result': result})else:#课程未选择,返回错误result = '课程未选修,无法删除!'return JsonResponse({'result': result})

views里面增加了函数,urls记得也要注册路由。

urlpatterns = [......url(r'^delcourse/', delcourse),    
]

最后前端selcourse.html页面绑定到删除按钮:

<button class="btn btn-xs btn-danger" title="删除" onclick="delcourse('{{ i.cno }}',)">

最终效果如下:

1ccc30de4a80d8270840e6886413ec1b.png

7e7b56ab9c817ee76ee13d182d994c0e.png

3、已选课程展示

还是利用magicbox选择一个面板,拷贝代码,然后利旧一下stuinfo里面的<table>标签代码,拷贝一段,按照已选课程需要展示的字段进行修改。

f351bce800685acd718c5a273996dac1.png

这里的难点有一个关联查询,因为course只有课程内容,没有授课老师,需要通过tno进行跨表连接,而student与course也没有直接联系,需要通过score中间表来进行连接,因此需要进行多表的跨表查询。

(现实生产环境的数据库表与字段比这里的数量要多得多,因此,能够达到目标查询要求的SQL语句的编写,也是数据库开发岗位日常工作的一部分。)

前端页面:stuinfo.html原来</table>后面继续增加面板与表格。

<div class="king-panel8 m15"><div class="king-panel8-header"><h3 class="king-panel8-title king-info">已选课程</h3></div><div class="king-panel8-content pt25"><table class="table table-bordered"><thead><tr><th>课程ID</th><th>课程名称</th><th>学分</th><th>上课时间</th><th>上课地点</th><th>授课老师</th></tr></thead><tbody>{% for j in selcourse %}<tr><td>{{ j.score__cno }}</td><td>{{ j.score__cno__cname }}</td><td>{{ j.score__cno__ccredit }}</td><td>{{ j.score__cno__ctime }}</td><td>{{ j.score__cno__cplace}}</td><td>{{ j.score__cno__tno_id__tname }}</td></tr>{% endfor %}</tbody></table></div></div>

业务逻辑:

def stuinfo(request):username = request.session['username']userinfo = student.objects.filter(username=username)selcourse = student.objects.filter(username=username).values('score__cno','score__cno__cname','score__cno__ccredit','score__cno__ctime','score__cno__cplace','score__cno__tno_id__tname')print (selcourse)return render_to_response('stuinfo.html',locals())

以上述为例,关联查询,首先找student表进行查询,然后与student表直接关联的表格是score表,所以后面values首先写score,然后双下划线可以直接引用score表里面的字段cno。然后通过cno可以关联到course里面的字段吗,再双下划线引用,通过course里面的tno_id字段又可以关联到teacher表,最后引用teacher表字段。

最终刷新页面效果如下:

8c727941daf4122d113d3d8086d0a47e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_802992.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php房产cms,易居cms房产网站系统 v0120 体验版

易居cms房产网站系统主要针对房地产行业开发的房产网站系统&#xff0c;以thinkphp5.0为内核开发&#xff0c;主要有新房功能、二手房、租房功能。目前版本主要为新房易居cms房产网站系统功能说明&#xff1a;1、新房发布2、楼盘团购3、楼盘资讯4、楼盘报名5、区域设置等相关功…

长尾词推广系统推荐乐云seo_网站seo如何利用长尾词快速获取排名?

一个SEO做得成功的网站&#xff0c;80%的流量应该来源于长尾关键词&#xff0c;长尾广泛分布于网站的标签、文章、专题等页面&#xff0c;最多的还是文章页&#xff0c;通常一篇文章就是一个甚至几个长尾关键词的载体。说起长尾词&#xff0c;SEO们肯定了解长尾词的重要性&…

2个网页跳来跳去_2020年SEO优化-网页的标题标签(Title Tag)要怎么写才是最优化?...

2020年SEO优化-网页的标题标签&#xff08;Title Tag&#xff09;要怎么写才是最优化&#xff1f;1、网页的标题标签有效长度是64个字节&#xff0c;汉语是32个字。长出来的部分无益有弊。为什么网页的标题标签太长反而不好&#xff1f;2、标题标签中务必出现这个页面的关键词&…

网站图片全自动加密_https到底加密了什么?

问题描述都说https是在http和tcp两层之间加密&#xff0c;针对的是传输过程&#xff0c;只有客户端和服务端才能解密&#xff0c;变成明文。但是又有很多人说&#xff0c;https协议下&#xff0c;用get请求不加密&#xff0c;需要用post才会加密&#xff0c;而且这么说的人很多…

怎么向activemq服务器拉取数据_网站迁移到香港服务器机房,怎么保护数据?

服务器迁移&#xff0c;无非是服务器不稳定出现故障&#xff0c;或服务器遭受恶意攻击&#xff0c;造成网站无法访问。假如是网站牌照到期了&#xff0c;网站不想备案&#xff0c;服务器迁移香港&#xff0c;是最后的选择&#xff0c;只有是迫不得已更换服务器&#xff0c;那服…

源码网站都有哪些_关于语音直播源码开发都有哪些模式和功能组成?

随着互联网技术和时代的发展&#xff0c;视频直播已经融入各行各业&#xff0c;成为人们生活的一部分&#xff0c;娱乐直播、会议直播、行业直播等等&#xff0c;互动视频直播市场在不断的扩大。根据不同的用户需求&#xff0c;直播也衍生出了多种产品类型&#xff0c;语音直播…

论文反抄袭软件_留学生的论文写作锦囊!知道这几个网站,再也不怕找不到资料了...

留学有问题&#xff1f;直接私信咨询我即将踏上这条留学之路的你们&#xff0c;是不是对大洋彼岸的世界充满着期待呢&#xff1f;在国内严苛的基础素质教育磨练下&#xff0c;我们面对各种考试&#xff0c;早已轻车熟路。就这样&#xff0c;带着满满自信的我们&#xff0c;开启…

网站集所使用的内容数据库转移及相关stsadm命令

说明&#xff1a;如果一个web应用程序的内容数据库太大&#xff0c;则要考虑把该内容数据库中的网站集分离到另一个内容数据库&#xff0c;以减轻数据库的压力 一、内容数据库转移 在默认的情况下&#xff0c;每个SharePoint Web应用程序只会使用一个内容数据库(Content Databa…

泄露门年终盘点:***用户网站间的“罗生门”

【eNet硅谷动力资讯中心消息】12月30日消息&#xff0c;随着多家银行纷纷辟谣澄清“用户密码遭盗”传言&#xff0c;岁末频频搅动国内互联网安全神经的“泄露门”事件或许将伴随着新年的钟声&#xff0c;与我们一起步入传说中的2012。***、用户、网站——这一关系微妙、此消彼长…

ZenCart如何优化,ZenCart新站如何操作,ZenCart SEO细节

2019独角兽企业重金招聘Python工程师标准>>> 注意事項&#xff1a; 1、網站的nofollow标簽使用情況&#xff1b; 2、确保網站沒有死鏈接(用WebSite Auditor分析)&#xff0c;設置好404&#xff1b; 3、網站地圖和網站robots.txt文件是否存在&#xff1b; 4、網站的g…

CentOS7下部署网站并访问

CentOS7下部署网站并访问 在CentOS7下部署网站&#xff0c;并可以通过公网ip访问。 首先&#xff0c;确保你的虚拟机具备以下条件&#xff1a; 1.能正常联网。 2.具备java环境。 1.查看虚拟机是否正常联网&#xff0c;可以使用ping命令。 ping www.baidu.com出现该情况表…

世界知名网站的架构技术

为什么80%的码农都做不了架构师&#xff1f;>>> WikiPedia 技术架构学习分享 YouTube 的架构扩展 Internet Archive 的海量存储浅析 LinkedIn 架构笔记 Tailrank 网站架构 Twitter 的架构扩展: 100 倍性能提升 财帮子&#xff08;caibangzi.com&#xff09;网…

ecs服务器网站目录,ecs云服务器的根目录

ecs云服务器的根目录 内容精选换一换简要介绍一组Java命令行工具&#xff0c;用于处理高通量排序(HTS)数据和格式。开发语言&#xff1a;Java一句话描述&#xff1a;Java命令行工具开源协议&#xff1a;MIT建议的版本根据实际需要选择版本&#xff0c;本文档以picard-2.23.0为例…

7-Github Pages搭建个人网站

一、个人站点 https://用户名.github.io 搭建步骤 1&#xff09;创建个人站点 ->新建仓库&#xff08;注&#xff1a;仓库名必须是【用户名.github.io】&#xff09; 2&#xff09;在仓库下新建index.html的文件即可脚下留心 1、github pages 仅支持静态网页 2、仓库里面只…

搭建nginx网站服务及应用

实验环境&#xff1a;服务器系统&#xff1a;Redhat 6.2 ip地址&#xff1a;192.168.10.1客户机系统&#xff1a;Win7 64位 旗舰版 ip地址&#xff1a;192.168.10.2系统环境&#xff1a;已搭建LAMP平台1、搭建nginx服务并实现访问状态统计[rootlocalhost ~]#yum …

动易多屏优化怎么实现网站自动识别用户访问设备

原文转载自http://www.pangshayu.com/html/8634.html动易多屏优化技术是指在保持同一域名、同一后台、同一数据库、同一套系统的基础上&#xff0c;不同设备&#xff08;PC/手机/PAD&#xff09;来访问网站前台时&#xff0c;网站都会针对此类设备显示与之最相适应和专为此类设…

Excel抓取网站内容

在浏览网页时&#xff0c;你一定会不时看到一些需要保存的数据信息。这些信息或许是一个完整的表格&#xff0c;或许是一段文字&#xff0c;如果要保存这类信息&#xff0c;我们常用的方法就是拖动鼠标&#xff0c;选中这些信息&#xff0c;然后用Ctrl&#xff0b;C组合键复制文…

黑帽seo程序内部链接的分布原理

本文来讲一下内链的分布原理&#xff0c;其实黑帽seo很简单&#xff0c;尤其是当你了解了它的做法原理之后&#xff0c;那么只需要会代码编程就可以实现很多的黑帽seo手法。链接是seo中比较重要的一个内容&#xff0c;今天我们着重讲一下程序内部链接的分布原理。内部链接指的是…

百万级访问量网站的技术准备工作

百万级访问量网站的技术准备工作 当今从纯网站技术上来说&#xff0c;因为开源模式的发展&#xff0c;现在建一个小网站已经很简单也很便宜&#xff0c;所以很多人都把创业方向 定位在互联网应用。这些人里大多数不是很懂技术&#xff0c;或者不是那么精通&#xff0c;而网站开…

如何为你的网站设置404页面(转)

一个好的网站&#xff0c;拥有一个好的 404页面 是标配。 为何要有 404页面&#xff1f;如何设置一个 404页面&#xff1f; why 404 pages&#xff1f; 在本地&#xff0c;比如我打开 localhost/fuck.htm&#xff08;该文件不存在&#xff09;&#xff0c;HTTP 返回 404 Not Fo…