ORM版学员管理系统2
学生信息管理
展示学生信息
URL部分
url(r'^student_list/', app01_views.student_list, name="student_list"),
视图部分
def student_list(request):
student_list = models.Student.objects.all()
return render(request, "student_list.html", {"student_list": student_list})
前端部分
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>学生列表</title>
</head>
<body>
<a href="{% url 'add_student' %}">添加学生</a>
<table border="1">
<thead>
<tr>
<th>#</th>
<th>id</th>
<th>学生姓名</th>
<th>学生班级</th>
<th>开班日期</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for student in student_list%}
<tr>
<td>{{ forloop.counter}}</td>
<td>{{ student.id }}</td>
<td>{{ student.sname }}</td>
<td>{{ student.cid.cname }}</td>
<td>{{ student.cid.first_day|date:'Y-m-d' }}</td>
<td>
<a href="{% url 'delete_student' student.id %}">删除</a>
<a href="{% url 'edit_student' student.id %}">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
删除学生信息
URL部分
url(r'^delete_student/(?P<sid>\d+)$', app01_views.delete_student, name="delete_student"),
视图部分
def delete_student(request, sid):
models.Student.objects.filter(id=sid).delete()
return redirect(reverse("student_list"))
前端部分
<a href="{% url 'delete_student' student.id %}">删除</a>
添加学生信息
URL部分
url(r'^add_student/$', app01_views.add_student, name="add_student"),
视图部分
def add_student(request):
if request.method == "POST":
sname = request.POST.get("sname")
class_id = request.POST.get("class_id")
models.Student.objects.create(sname=sname, cid_id=class_id)
return redirect(reverse("student_list")) class_list = models.Class.objects.all()
return render(request, "add_student.html", {"class_list": class_list})
前端部分
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>添加学生</title>
</head>
<body>
<form action="{% url 'add_student' %}" method="post">
{% csrf_token %}
<p>学生姓名:<input type="text" name="sname"></p>
<label for="class_id">所在班级:</label>
<select name="class_id" id="class_id">
{% for class in class_list %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endfor %}
</select>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
编辑学生信息
URL部分
url(r'^edit_student/(?P<sid>\d+)$', app01_views.edit_student, name="edit_student"),
视图部分
def edit_student(request, sid):
# 获取到编辑的学生对象
student_obj = models.Student.objects.get(id=sid)
# 获取所有的班级数据
class_list = models.Class.objects.all() if request.method == "POST":
sname = request.POST.get("sname")
class_id = request.POST.get("class_id")
student_obj.sname = sname
student_obj.cid_id = class_id
student_obj.save()
return redirect(reverse("student_list")) return render(request, "edit_student.html", {"student": student_obj, "class_list": class_list})
前端部分
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>编辑学生信息</title>
</head>
<body>
<form action="{% url 'edit_student' student.id %}" method="post">
{% csrf_token %}
<p>学生姓名:<input type="text" name="sname" value="{{ student.sname }}"></p>
<label for="class_id">所在班级:</label>
<select name="class_id" id="class_id">
{% for class in class_list %}
{% if class.id == student.cid_id %}
<option value="{{ class.id }}" selected>{{ class.cname }}</option>
{% else %}
<option value="{{ class.id }}">{{ class.cname }}</option>
{% endif %}
{% endfor %}
</select>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
基于对象的跨表查询
一对多查询(班级表和学生表)
正向查询(由学生表查询班级表)
查询学生的班级信息
>>> student_obj = models.Student.objects.first()
>>> student_obj.cid # 通过model类中的属性查找到对应的外键数据对象
<Class: Class object>
>>> student_obj.cid.cname
'1班'
>>> student_obj.cid_id # 获取实际外键的值
反向查询(由班级表查询学生表)
查询班级的学生信息
>>> class_obj = models.Class.objects.first() # 获取第一个班级对象
>>> class_obj.student_set.all() # 通过表名_set反向查询出所有的学生
<QuerySet [<Student: Student object>, <Student: Student object>]>
注意:
如果不在外键的字段中设置related_name的话,默认就用表名_set。
如果设置了related_name="students",反向查询时可直接使用students进行反向查询。
>>> class_obj.students.all()
一对一查询
表结构设计
class Student(models.Model):
sname = models.CharField(max_length=32, verbose_name="学生姓名")
the_class = models.ForeignKey(to=Class, to_field="id", on_delete=models.CASCADE, related_name="students")
detail = models.OneToOneField(to="StudentDetail", null=True) class StudentDetail(models.Model):
height = models.PositiveIntegerField()
weight = models.PositiveIntegerField()
email = models.EmailField()
正向查询(由学生信息表查询学生详情表)
>>> student_obj = models.Student.objects.first()
>>> student_obj.detail.email
'1@1.com'
反向查询(由学生详情表反向查询学生信息表)
>>> detail_obj = models.StudentDetail.objects.get(id=)
>>> detail_obj.student.sname
'a'
ORM版学员管理系统2的更多相关文章
- ORM版学员管理系统
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
- ORM版学员管理系统1
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
- ORM版学员管理系统 2
学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...
- ORM版学员管理系统 3
老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...
- ORM版学员管理系统3
老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 class Class(models.Model): id = models.AutoField(primary_key=Tr ...
- Django之ORM版学员管理系统
班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = models.CharF ...
- 老男孩Day13作业:ORM学员管理系统
一.作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上 ...
- 【学员管理系统】0x03 老师信息管理功能
[学员管理系统]0x03 老师信息管理功能 老师信息管理相比于学生信息管理又多了一点,因为我们的数据结构中老师表和班级表是通过teacher2class表进行多对多关联的. 写在前面 项目详细需求参见 ...
- Python开发程序:学员管理系统(mysql)
主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...
随机推荐
- 【golang-GUI开发】struct tags系统(一)
我们已经介绍了qt的signal和slot,现在该讲讲它的struct tags系统了.qt拥有多种的struct tags,我们会去一一了解它们. 什么是struct tags? struct ta ...
- NPOI导出EXCEL报_服务器无法在发送 HTTP 标头之后追加标头
虽然发表了2篇关于NPOI导出EXCEL的文章,但是最近再次使用的时候,把以前的代码粘贴过来,居然报了一个错误: “服务器无法在发送 HTTP 标头之后追加标头” 后来也查询了很多其他同学的文章,都没 ...
- .NET CORE 实践(2)--对Ubuntu下安装SDK的记录
根据官网Ubuntu安装SDK操作如下: allen@allen-Virtual-Machine:~$ sudo apt-key adv --keyserver apt-mo.trafficmanag ...
- .NET 配置文件实用指南
我想大家对配置文件一定不会陌生,在大部分的项目中都会用到它,在此笔者给出一些配置文件的实用示例. XML配置文件 利用XML格式的配置文件储存连接字符串,再用反射技术读取. using System. ...
- 如何调用common.js
第一步 页面需要引用此js 第二步 var loginJs = { //登录 goLogin: function () { var _userinfo = { name: "夏小沫" ...
- Netty 系列六(编解码器).
一.概念 网络传输的单位是字节,如何将应用程序的数据转换为字节,以及将字节转换为应用程序的数据,就要说到到我们该篇介绍的编码器和解码器. 将应用程序的数据转换为网络格式,以及将网络格式转换为应用程序的 ...
- 提高 JavaScript 开发效率的高级 VSCode 扩展!
原文:提高 JavaScript 开发效率的高级 VSCode 扩展! 作者:前端小智 Fundebug经授权转载,版权归原作者所有. Quokka.js Quokka.js 是一个用于 JavaSc ...
- PHP全路径无限分类导航LINK代码实现
<?php /** * @param php全路径无限分类 */ include('db.inc.php'); function getPathCate($cateid){ $sql = &qu ...
- 详解bootstrap-fileinput文件上传控件的亲身实践
经理让我帮服务器开发人员开发一个上传文件功能界面,我就想着以前使用过bootstrap-fileinput插件进行文件上传,很不错.赶紧就撸起来了. 1.下载压缩包.插件地址https://githu ...
- canvas-6shadow.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...