Django之搭建学员管理系统
GET请求传参数的方式:
/xxx/?k1=v1&k2=v2
? 前面的是URL
?后面的是请求的参数
多个参数之间用&分隔
POST请求传数据:
是放在请求体里面的
表结构设计.
-- 创建班级表
CREATE TABLE class(
id int auto_increment PRIMARY KEY,
name CHAR(10) not null
)engine=innodb DEFAULT charset=utf8; -- 创建学生表
CREATE TABLE student(
id int auto_increment PRIMARY KEY,
name CHAR(10) not null,
class_id INT, FOREIGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE
)engine=innodb DEFAULT charset=utf8; -- 创建老师表
CREATE TABLE teacher(
id int auto_increment PRIMARY KEY,
name CHAR(10) not null
)engine=innodb DEFAULT charset=utf8; -- 创建老师和班级关系表
CREATE TABLE teacher2class(
id INT AUTO_INCREMENT PRIMARY KEY,
teacher_id INT,FOREIGN KEY (teacher_id) REFERENCES teacher(id) ON DELETE CASCADE ON UPDATE CASCADE ,
class_id INT,FOREIGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE
)engine=innodb DEFAULT charset=utf8; 表结构设计
结构
视图函数+模板语言+pymysql
视图函数:
我们把所有的处理请求相关的函数从 urls.py中拿出来,统一放在一个叫views.py的文件中,这样就把代码模块化,实现不同功能的代码放在不同的模块。
urls.py文件中只放置 URL和函数的对应关系
views.py 文件中只放置那些针对不同URL执行的函数
注意:
这个时候就需要在urls.py中导入views.py文件(views前面加.表明从当前目录下导入)
from .views import index, login, class_list, delete_class, add_class, edit_class
展示所有的班级列表
# 展示所有的班级列表
def class_list(request):
# 这个函数是展示所有的班级列表
# 1. 去数据库里取数据
# 连接数据库
conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")
# 指定pymysql查询出的每条数据的类型是字典类型({"字段名": "值"}) *****
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 写好查询的SQL语句
sql = "select id, cname from class order by id;"
# 执行上面定义好的SQL语句
cursor.execute(sql)
# 拿到所有查询到的结果
# 此处查询结果是一个大列表,里面是一个一个字典
ret = cursor.fetchall()
# 关闭连接
cursor.close()
conn.close()
# 2. 用数据去替换HTML页面中的特殊符号,特殊符号是按照Django模板语言的语法写好的
# render()的第三个参数是一个字典,字典的key是什么,HTML文件中的变量名就写什么
return render(request, "class_list.html", {"class_list": ret})
函数
页面部分:
这里用到了Django模板语言的for循环
<!-- Table -->
<div class="my-table-wrapper">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>#</th>
<th>班级ID</th>
<th>班级名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for class in class_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td scope="row">{{ class.id }}</td>
<td>{{ class.cname }}</td>
<td class="text-center">
<a href="/edit_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-info" aria-label="Left Align">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>新页面编辑
</a>
<a type="button" class="btn btn-sm btn-success" aria-label="Left Align">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>编辑
</a>
<a href="/delete_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-danger" aria-label="Left Align">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
页面
删除班级
# 删除班级
def delete_class(request):
# 根据班级的ID删除
# 班级ID从哪儿来? --> 需要页面发起请求的时候携带
# 页面如何携带要删除的班级的ID? --> 通过给a标签设置href属性时拼接
# 后端拿到要删除的班级的ID
class_id = request.GET.get("class_id")
# 去数据库里删除
# 连接数据库
conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")
# 指定输出的每条数据的类型是字典
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 删除操作的SQL语句
sql = "delete from class where id=%s;"
# 执行删除语句
cursor.execute(sql, class_id)
# 向数据库提交操作
conn.commit()
cursor.close()
conn.close()
# 执行完删除操作后跳转回班级列表页面
return redirect("/class_list/")
删除的逻辑
页面部分:
浏览器发起的GET请求通过在URL后面添加/url/?k1=v1&k2=v2的方式添加参数。
使用Django模板语言的语法将{{ class.id }}拼接到了a标签的href属性中。
这样页面点击这个a标签就能把要删除的班级ID值传递给后端了。
<a href="/delete_class/?class_id={{ class.id }}" type="button" class="btn btn-sm btn-danger" aria-label="Left Align">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除
</a>
页面
添加班级
# 添加班级
def add_class(request):
# 如果是POST请求,就表明是页面要提交数据
if request.method == "POST":
# 页面使用POST方法提交添加班级的数据
# 后端取到新班级的名称信息
class_name = request.POST.get("cname")
conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")
# 指定输出的结果类型是字典
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 新增班级的SQL语句
sql = "insert into class (cname) VALUE (%s);"
# 执行SQL语句,在数据库中创建一条新的班级记录
cursor.execute(sql, class_name)
# 向数据库提交
conn.commit()
# 关闭连接
cursor.close()
conn.close()
# 新添加一个班级之后跳转到班级列表页面
return redirect("/class_list/")
# 如果不是POST请求就返回添加班级页面
return render(request, "add_class.html")
添加的逻辑
页面部分:
利用form表单向后端提交新班级的数据,所以add_class.html页面中form表单要填写上action="/add_class/” 和 method=“post”
<form action="/add_class/" method="post">
<input type="text" name="cname">
<input type="submit" value="提交">
</form>
页面
编辑班级信息
# 新页面编辑班级信息
def edit_class(request):
# 如果是POST请求
if request.method == "POST":
# 从页面POST过来的数据中取到编辑的班级ID
class_id = request.POST.get("id")
# 从页面POST过来的数据中取到班级名称
class_cname = request.POST.get("cname")
# 去数据库里面更新班级名称
# 连接数据库
conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")
# 获取光标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 更新班级信息的SQL语句
sql = "update class set cname=%s where id=%s;"
# 执行SQL语句
cursor.execute(sql,(class_cname, class_id))
# 向数据库提交修改
conn.commit()
# 关闭连接
cursor.close()
conn.close()
# 更新完班级信息之后跳转回班级列表页面
return redirect("/class_list/") # 如果不是POST请求,就表明是点击了新页面编辑班级信息的按钮
# 取到被编辑的班级的ID
class_id = request.GET.get("class_id")
# 去数据库里查询当前班级的信息
conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8")
# 指定输出的单条数据的类型是字典
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 查询的SQL语句
sql = "select id, cname from class WHERE id=%s;"
# 执行查询操作
cursor.execute(sql, class_id)
# 取单条数据
ret = cursor.fetchone()
# 关闭连接
cursor.close()
conn.close()
# 把要编辑的班级的信息 替换 edit_class.html 页面中的特殊符号,最后把页面返回给浏览器
return render(request, "edit_class.html", {"class_info": ret})
编辑的逻辑
页面部分:
编辑班级信息在页面上展示的就是一个form表单,用户更新完班级信息之后要提交,就需要向后端提交表单数据。
这个时候form表单就需要配置好 action="/edit_class/" 和 method="post"。
但是提交的数据里需要告知后端,我更改的是数据库中的哪一条班级信息,所以这里要把班级ID也放到form表单中。
班级ID不应该让用户修改,所以就把班级ID的input框给隐藏掉。
<form action="/edit_class/" method="post">
<input type="text" name="id" value="{{ class_info.id }}" style="display: none">
<input type="text" name="cname" value="{{ class_info.cname }}">
<input type="submit" value="提交">
</form>
HTML
Django之搭建学员管理系统的更多相关文章
- django+pymysql搭建一个管理系统(一)
django+pymysql搭建一个管理系统(一) 后续进行代码更新,优化 一.程序架构 二.mysql表单创建 zouye库:存信息相关的 #班级表 create table classes( ci ...
- Python学习(二十七)—— Django和pymysql搭建学员管理系统
转载自http://www.cnblogs.com/liwenzhou/p/8270250.html 一.学员管理系统 1.项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的e ...
- Django和pymysql搭建学员管理系统
学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司急需一套方便易用的“学员管理系统”,来提 ...
- Django项目之【学员管理系统】
Django项目[学员管理系统] 项目规划阶段 项目背景 现实生活中,特别是在学校,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求. 因此需一套方便易用的“学员管理系统”,来提高 ...
- 学员管理系统(简单的Django设计)
学员管理系统(简单的Django设计) 学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司 ...
- Django pymysql学员管理系统
学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司急需一套方便易用的“学员管理系统”,来提 ...
- python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)
''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...
- python3.6+django2.0 一小时学会开发一套学员管理系统demo
1.在pycharm中新建project demo1 添加app01 点击create按钮完成新建 2.在demo项目目录下新建目录static,并在settings.py中追加代码: STATICF ...
- ORM版学员管理系统
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
随机推荐
- python之路 堡垒机paramiko
paramiko 1.安装 pip3 install paramiko 二.使用 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建S ...
- html 基础 超链接
***设置超链接的样式示例 a:link 超链接被点前状态 a:visited 超链接点击后状态 a:hover 悬停在超链接时 a:active 点击超链接时 在定义这些状态时,有一个顺序l v ...
- spring配置中classpath: 与classpath*:的区别
classpath和classpath*区别: classpath:只会到你的class路径中查找找文件. classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找 ...
- Python3.x:Linux下退出python命令行
Python3.x:Linux下退出python命令行 退出命令: quit() #或者 exit() #或者 Ctrl-D
- Apache 域名跳转配置
域名跳转 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 . 参数格式 参数: Apache mod_rewrite 规 ...
- linux 查看内存信息,及其他硬件信息 dmidecode命令
由于想换内存,想看看内存型号.频率,简单搜了下命令 可以用dmidecode 命令查看. dmidecode -t memory 这个命令可以查看内存的几乎所有信息,包括频率 大小等等 另外这个命令强 ...
- 20145217《信网络对抗》逆向与BOF基础实践
20145217<信网络对抗>逆向与BOF基础实践 内容: 一.简单机器指令,汇编语言 1.'objdump -d xxx|more'反汇编命令查看机器代码,'cat'显示文件内容,'xx ...
- Cisco、HUAWEI、H3c、Firewall等设备配置snmp
配置HUAWEI交换机S1720.S2700.S5700.S6720等型号设备的snmp v3配置 注:此配置来源自官方配置文档 操作步骤 配置交换机的接口IP地址,使其和网管站之间路由可达 (图1) ...
- AMD C1E SUPPORT
•C1E是一种电源管理状态,它可以让处理器节能不限于处理器内核.在CIE状态,可以通过降低内存时钟速度.关闭HT技术,来降低处理器能耗.这种新功能对于12核的处理器极其重要,因为这种处理器在设计上既增 ...
- OSTU二值化算法
介绍 Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为: 1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个 ...