使用ORM进行前后端数据交互
使用ORM进行数据交互
前期准备
必备知识:ORM操作,数据库多表操作、Django部分知识。
三张表:班级、老师、学生
一对多关系:班级与学生
多对多关系:班级与老师
#创建班级表
class Classes(models.Model):
title = models.CharField(max_length=32)
n=models.ManyToManyField('Teachers') #创建老师表
class Teachers(models.Model):
name= models.CharField(max_length=32)
age=models.IntegerField(default=30)
gender=models.BooleanField(default=False)
is_married=models.BooleanField(default=True)
address = models.CharField(max_length=50,default='xiaogan') #创建学生表
class Student(models.Model):
username=models.CharField(max_length=32)
age=models.IntegerField()
#只能写true和false
gender=models.BooleanField()
cs=models.ForeignKey(Classes,on_delete=models.DO_NOTHING)
address=models.CharField(max_length=50,default='xiaogan')
目标
1.对学生,班级的增删改查 2.为班级分配老师
URL路由
from django.contrib import admin
from django.urls import path
from app01.views import * urlpatterns = [
path('admin/', admin.site.urls),
path('classes.html/',get_classes),
path('addclasses.html/',add_classes),
path('delclasses.html/',del_classes),
path('altclasses.html/',alt_classes),
path('student.html/', get_student),
path('addstudent.html/',add_student),
path('delstudent.html/',del_student),
path('altstudent.html/', alt_student),
path('choose_teacher.html/', choose_teacher),
path("ajax_get_date.html/", ajax_get_data),
]
路由代码
创建表
from django.db import models # 一对多:班级与学生
# 多对多:班级与老师 # Create your models here.
#创建班级表
class Classes(models.Model):
title = models.CharField(max_length=32)
n=models.ManyToManyField('Teachers') #创建老师表
class Teachers(models.Model):
name= models.CharField(max_length=32)
age=models.IntegerField(default=30)
gender=models.BooleanField(default=False)
is_married=models.BooleanField(default=True)
address = models.CharField(max_length=50,default='xiaogan') #创建学生表
class Student(models.Model):
username=models.CharField(max_length=32)
age=models.IntegerField()
#只能写true和false
gender=models.BooleanField()
cs=models.ForeignKey(Classes,on_delete=models.DO_NOTHING)
address=models.CharField(max_length=50,default='xiaogan')
代码
视图函数
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here. def get_classes(request):
cls_list=models.Classes.objects.all()
print(cls_list)
# return HttpResponse('ok')
return render(request,"get_classes.html",{'cls_list':cls_list}) def add_classes(request):
if request.method=='GET':
return render(request,'add_classes.html')
elif request.method=="POST":
title=request.POST.get('title')
print(title) # ret=models.Classes.objects.all().values('title')
# for Title in ret:
# if Title['title']==title:
# print(Title)
models.Classes.objects.create(title=title)
#注意这里是url路径
return redirect('/classes.html') def del_classes(request):
nid=request.GET.get('nid')
print(nid)
ret=models.Classes.objects.filter(id=nid).delete()
print(ret)
return redirect('/classes.html/') def alt_classes(request):
if request.method=="GET":
nid = request.GET.get('nid')
obj=models.Classes.objects.filter(id=nid)[0]
return render(request,'alt_classes.html',{'obj':obj})
elif request.method=="POST":
nid=request.GET.get("nid")
title=request.POST.get("title")
models.Classes.objects.filter(id=nid).update(title=title)
return redirect("/classes.html/") def get_student(request):
stu_list = models.Student.objects.all()
print(stu_list)
# return HttpResponse('ok')
return render(request, "get_student.html", {'stu_list': stu_list})
def add_student(request):
if request.method=='GET':
cs_list=models.Classes.objects.all()
print(cs_list)
return render(request,'add_student.html',{'cs_list':cs_list})
elif request.method=="POST":
name=request.POST.get('name')
age=request.POST.get('age')
gender=request.POST.get('gender')
cs_id=request.POST.get('class')
address=request.POST.get('address')
print(name,age,gender,cs_id,address)
# ret=models.Classes.objects.all().values('title')
# for Title in ret:
# if Title['title']==title:
# print(Title)
models.Student.objects.create(username=name,age=age,gender=gender,cs_id=cs_id,address=address)
#注意这里是url路径
return redirect('/student.html') def del_student(request):
nid = request.GET.get('nid')
print(nid)
ret = models.Student.objects.filter(id=nid).delete()
print(ret)
return redirect('/student.html/')
def alt_student(request):
if request.method=="GET":
nid = request.GET.get('nid')
obj=models.Student.objects.filter(id=nid)[0]
cs_list = models.Classes.objects.all()
return render(request,'alt_student.html',locals()) elif request.method=="POST":
nid=request.GET.get("nid")
name = request.POST.get('name')
age = request.POST.get('age')
gender = request.POST.get('gender')
cs_id = request.POST.get('class')
address = request.POST.get('address')
print(name, age, gender, cs_id, address)
models.Student.objects.filter(id=nid).update(username=name,age=age,gender=gender,cs_id=cs_id,address=address)
return redirect("/student.html/")
def choose_teacher(request): if request.method=="GET":
nid=request.GET.get('nid')
print(nid)
#多对多的字段创建的Class表,我们可以通过id,拿到这个班级对象
#
cls=models.Classes.objects.filter(id=nid).first()
#当前班级的老师列表
cls_teacher=cls.n.all() #所有老师的列表
teacher_list=models.Teachers.objects.all() teachers=[]
#如果teacher在cls_list中,说明,这个老师已经是这个班级的任课老师
for teacher in teacher_list:
if teacher in cls_teacher:continue
else:teachers.append(teacher) return render(request,"set_teacher.html",{'teachers':teachers,'cls_teacher':cls_teacher,'nid':nid})
elif request.method=="POST":
#获取现在操作的班级id
nid=request.GET.get("nid")
#获取现在所选老师 id
teacher_id=request.POST.get('teacher_id')
print(nid,teacher_id)
Class=models.Classes.objects.filter(id=nid).first()
Class.n.add(2)
# return render(request, "get_classes", {'nid': nid})
return redirect("/classes.html/")
代码
HTML代码
班级首页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <div>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for row in cls_list %}
<tr>
<td>
{{ row.id }}
</td>
<td>
{{ row.title }}
</td>
<td>
<a href="/delclasses.html?nid={{ row.id }}">删除</a> <a href="/altclasses.html?nid={{ row.id }}">编辑</a> <a href="/choose_teacher.html?nid={{ row.id }}">分配老师</a>
</td>
</tr>
{% endfor %}
<tr>
<td> </td>
<td>
<a href="/addclasses.html/">添加</a>
</td>
</tr>
</tbody>
</table>
</div> </body>
</html>
编辑班级名称代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/altclasses.html/?nid={{ obj.id }}" method="post">
{% csrf_token %}
<p><input type="text" name="title" value="{{ obj.title }}"></p>
<!--<p><input type="text" name="id" value="{{ obj.id }}"></p>-->
<input type="submit">
</form>
</body>
</html>
添加班级代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/addclasses.html/" method="post">
{% csrf_token %}
<p>班级:<input type="text" name="title"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
为班级分配任课老师
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>班级现在的任课老师:
{% for teacher in cls_teacher %}
<p>{{ teacher.name }}</p>
{% endfor %}
</p>
添加新的任课老师:<br>
<form action="/choose_teacher.html/?nid={{ nid }}" method="post">
{% csrf_token %}
<select multiple size=10 name="teacher_id">
{% for item in teachers %}
<option value="{{ item.id }}">{{ item.id }} {{ item.name }}</option>
{% endfor %}
</select>
<!-- {{ item.name }}-->
<br>
<input type="submit">
</form>
</body>
</html>
学生首页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <div>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>班级</th>
<th>住址</th>
<th>行为</th>
</tr>
</thead>
<tbody>
{% for row in stu_list %}
<tr>
<td>
{{ row.id }}
</td>
<td>
{{ row.username }}
</td>
<td>
{{ row.age }}
</td>
<td>
{{ row.gender }}
</td>
<td>
{{ row.cs.title }}
</td>
<td>
{{ row.address }}
</td>
<td>
<a href="/delstudent.html?nid={{ row.id }}">删除</a> <a href="/altstudent.html?nid={{ row.id }}">编辑</a>
</td>
</tr>
{% endfor %}
<tr>
<td> </td>
<td>
<a href="/addstudent.html/">添加</a>
</td>
</tr>
</tbody>
</table>
</div> </body>
</html>
添加学生代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/addstudent.html/" method="post">
{% csrf_token %}
<p>学生姓名:<input type="text" name="name"></p>
<p>学生年龄:<input type="text" name="age"></p>
<p>性别:男<input type="radio" name="gender" value='1'> 女<input type="radio" name="gender" value='0' > </p>
<select name="class">
{% for row in cs_list %}
{{ row.id }}
班级:<option value="{{ row.id }}">{{ row.title }}</option>
{% endfor %}
</select>
<p>住址:<input type="text" name="address"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
编辑学生代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/altstudent.html/?nid={{ obj.id }}" method="post">
{% csrf_token %}
<p>学生姓名:<input type="text" name="name"></p>
<p>学生年龄:<input type="text" name="age"></p>
<p>性别:男<input type="radio" name="gender" value='1'> 女<input type="radio" name="gender" value='0' > </p>
<select name="class">
{% for row in cs_list %}
{{ row.id }}
班级:<option value="{{ row.id }}">{{ row.title }}</option>
{% endfor %}
</select>
<p>住址:<input type="text" name="address"></p>
<p><input type="submit"></p>
<input type="submit">
</form>
</body>
</html>
注意:删除对应相应的视图函数处理
分析与总结
ORM:
具体看前几篇文章。
视图函数:
1.每次的请求可能有get数据,也有post发送过来的数据,如果处理方式不同,做相应的处理。
2.redirect(url):跳转到哪个页面下,这里面的url对应url里面的路径。
HTML:
1.
通过form表单向服务端发送数据。
客户端发送的是键值对,服务端接收到的也是键值对。
所以表单标签一定要使用name指定键名,text,password的值为用户输入,radio,select的值为用户选择,所以一定要设置对应每个选项的value值。
注意:比如男,女这种选项,value设置为"1","0",服务端存储到数据中会进行处理,转换为True,Flase。
2.通过id对应数据库表里的记录,而这个id通过get方式发送给服务端。
使用ORM进行前后端数据交互的更多相关文章
- 对GraphQL-BFF:微服务背景下的前后端数据交互方案的研究-------引用
随着多终端.多平台.多业务形态.多技术选型等各方面的发展,前后端的数据交互,日益复杂. 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费. 在理想情况下,这些复杂性可以全部由后端承担.前端只 ...
- 两种方法实现asp.net方案的前后端数据交互(aspx文件、html+ashx+ajax)
一个HTML页面只能显示HTML代码信息,不能与数据库进行数据的交互.asp.net方案提供了网页与数据库交互的方法,这里举出两种:①aspx文件 ②ashx文件+ajax技术 一.创建数据库 这里以 ...
- vue-resource的使用,前后端数据交互
vue-resource的使用,前后端数据交互 1:导入vue与vue-resource的js js下载: https://pan.baidu.com/s/1fs5QaNwcl2AMEyp_kUg ...
- 前后端数据交互处理基于原生JS模板引擎开发
json数据错误处理,把json文件数据复制到----> https://www.bejson.com/ 在线解析json 这样能直观的了解到是否是json数据写错,在控制台打断点,那里错误打那 ...
- web前后端数据交互
前后端数据交互是每一名web程序员必须熟悉的过程,前后端的数据交互重点在于前端是如何获取后端返回的数据,毕竟后端一般情况下只需要将数据封装到一个jsonMap,然后return就完了.下面通过一个li ...
- 前后端数据交互利器--Protobuf
Protobuf 介绍 Protocol Buffers(又名 protobuf)是 Google 的语言中立.平台中立.可扩展的结构化数据序列化机制. https://github.com/prot ...
- 前后端数据交互(八)——请求方法 GET 和 POST 区别
WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...
- SpringMVC前后端数据交互总结
控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...
- Spring MVC前后端数据交互总结
控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...
随机推荐
- The word 'localhost' is not correctly spelled 这个问题怎么解决
The word 'localhost' is not correctly spelled 这个问题怎么解决 有时工程中有下划线并提示 The word is not correctly spelle ...
- java怎样将一组对象传入Oracle存储过程
注:本文来源 < java怎样将一组对象传入Oracle存储过程 > java怎样将一组对象传入Oracle存储过程 java怎样将一组对象传入Oracle存储过程.须要注意的是jar ...
- ORA-00257: archiver error. Connect internal only, until freed.| Oracle数据库归档日志满导致应用系统反应缓慢的问题处理
一:查看原因 查看了下V$FLASH_RECOVERY_AREA_USAGE,看看归档目录使用的情况.果然是归档满了. Disconnected from Oracle Database 11g En ...
- Confluence 6 配置 Web 代理支持
这个页面中的相关平台中的内容是不被支持的.因此,Atlassian 支持不能保证能够为你提供任何支持.请注意,这个页面下面提供的信息仅为你提供参考同时也不能保证所有的的配置能正常工作.如果你按照本页面 ...
- Confluence 6 管理员联系表单的后台配置界面
管理员联系表单的后台配置界面截图和配置. 对输入的数据进行编辑和选择是否启用发送电子邮件给管理员 https://www.cwiki.us/display/CONFLUENCEWIKI/Configu ...
- exec与match方法的区别
http://www.cnblogs.com/xiehuiqi220/archive/2008/11/05/1327487.html var someText= "web2.0 .net2. ...
- jsp 错误处理
JSP提供了很好的错误处理能力.除了在Java代码 中可以使用try语句,还可以指定一个特殊页面.当应 用页面遇到未捕获的异常时,用户将看到一个精心设计 的网页解释发生了什么,而不是一个用户无法理解的 ...
- Sequence Number
1570: Sequence Number 时间限制: 1 Sec 内存限制: 1280 MB 题目描述 In Linear algebra, we have learned the definit ...
- docker文件复制到centos/linux/ubantun环境下
1.有些时候我们需要将容器里面的文件,弄到系统里面来分析,像报错log等 格式:docker cp 容器名:文件在容器里面的路径 要拷贝到宿主机的对应路径 2.有些情况下,我们需要将文 ...
- office之Excel 你会用 Ctrl + E 吗?
从Excel97至现在的最新版本2016,如果评选Excel中最简单.易用.功能最强大的技巧,非2013版新增的“快速填充”(快捷键 Ctrl+E)莫属.向下拖动复制后,打开下拉菜单,就可以看到它的身 ...