使用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进行前后端数据交互的更多相关文章

  1. 对GraphQL-BFF:微服务背景下的前后端数据交互方案的研究-------引用

    随着多终端.多平台.多业务形态.多技术选型等各方面的发展,前后端的数据交互,日益复杂. 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费. 在理想情况下,这些复杂性可以全部由后端承担.前端只 ...

  2. 两种方法实现asp.net方案的前后端数据交互(aspx文件、html+ashx+ajax)

    一个HTML页面只能显示HTML代码信息,不能与数据库进行数据的交互.asp.net方案提供了网页与数据库交互的方法,这里举出两种:①aspx文件 ②ashx文件+ajax技术 一.创建数据库 这里以 ...

  3. vue-resource的使用,前后端数据交互

    vue-resource的使用,前后端数据交互 1:导入vue与vue-resource的js js下载:   https://pan.baidu.com/s/1fs5QaNwcl2AMEyp_kUg ...

  4. 前后端数据交互处理基于原生JS模板引擎开发

    json数据错误处理,把json文件数据复制到----> https://www.bejson.com/ 在线解析json 这样能直观的了解到是否是json数据写错,在控制台打断点,那里错误打那 ...

  5. web前后端数据交互

    前后端数据交互是每一名web程序员必须熟悉的过程,前后端的数据交互重点在于前端是如何获取后端返回的数据,毕竟后端一般情况下只需要将数据封装到一个jsonMap,然后return就完了.下面通过一个li ...

  6. 前后端数据交互利器--Protobuf

    Protobuf 介绍 Protocol Buffers(又名 protobuf)是 Google 的语言中立.平台中立.可扩展的结构化数据序列化机制. https://github.com/prot ...

  7. 前后端数据交互(八)——请求方法 GET 和 POST 区别

    WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...

  8. SpringMVC前后端数据交互总结

    控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...

  9. Spring MVC前后端数据交互总结

    控制器 作为控制器,大体的作用是作为V端的数据接收并且交给M层去处理,然后负责管理V的跳转.SpringMVC的作用不外乎就是如此,主要分为:接收表单或者请求的值,定义过滤器,跳转页面:其实就是ser ...

随机推荐

  1. Confluence 6 升级自定义的站点和空间关闭缓存

    Velocity 被配置在内存中使用缓存模板.当你在 Confluence 中编辑了页面的模板文件,Confluence 知道文件进行了编辑,将会重新从磁盘中载入模板文件.如果你直接在 Conflue ...

  2. 对Swoole、Workerman和php自带的socket的理解

    为什么php自带的socket不怎么听说,基本都是用swoole,workerman去实现? 1.PHP的socket扩展是一套socket api,仅此而已. swoole,用C实现,它的socke ...

  3. 如何在cmd中安装python第三方模块

    打开 cmd终端 1 输入pip  install   模块名. 2 等待安装完成即可.

  4. strchr()

    strchr()主要有2个最有用的用法: 第一个:搜索字符串在另一字符串中的第一次出现.并返回剩余的部分 $str = "hello_chrdai_1993"; $not_incl ...

  5. cf里的一些简单组合数题

    cf711D 成环的和不成环的要单独计算,环用双联通做的QAQ /* 所有情况-成环的情况 */ #include<bits/stdc++.h> using namespace std; ...

  6. CTPN项目部分代码学习

    上次拜读了CTPN论文,趁热打铁,今天就从网上找到CTPN 的tensorflow代码实现一下,这里放出大佬的github项目地址:https://github.com/eragonruan/text ...

  7. 输出GPLT

    L1-023 输出GPLT (20 分)   给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符.当然,四种字符( ...

  8. Redis都有哪些数据类型

    string 这是最基本的类型了,就是普通的set和get,做简单的kv缓存 hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存 ...

  9. Kubeadm安装的K8S集群1年证书过期问题的解决思路

    这个问题,很多使用使用kubeadm的用户都会遇到. 网上也有类似的帖子,从源代码编译这种思路, 在生产环境,有些不现实. 还是使用kubeadm的命令操作,比较自然一点. 当然,自行生成一套证书,也 ...

  10. Temporal Segment Networks

    摘要 解决问题 用CNN框架有效提取video长时序特征 在UCF101等训练集受限的情况下训练网络 贡献 TSN网络,基于长时间时序结构模型.稀疏时序采样策略,视频层监督有效学习整个视频. HMDB ...