湖南郴州建设局网站,湖北建设厅官方网站,什么网站可以做引文分析,广州商城网站建设地址文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数
在没有用到choices参数之前#xff0c;我们在D… 文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数
在没有用到choices参数之前我们在Django ORM创建表类中的字段是不是下面这样的
# 举例这是一张用户基本信息表
class UserInfo(models.Model):username CharField(max_length32)age IntegerField() # 整型字段不要传max_length参数哦----特别注意gender CharField(max_length2)# 用户性别通过上面的userinfo表我们是否可以想一下在用户性别字段中人类的性别好像只有两种表示方式男/女那这样我们如果有100万条用户信息而这100万条用户的性别分别有50万男性和50万女性。
这个时候就造成了问题既然我们这个字段的描述信息只需要两种描述就能完成这个用户字段在性别的描述我们为什么不想一种方便简洁的形式去描述每一个用户的性别呢
这时候就可以用到choices参数
我们依然使用数字来记录gender这个用户性别字段的描述大家学过数据库就知道能用整型存储的信息为什么要用字符型呢很明显是因为整型比字符型占的空间小。注意并不是所有的这种仅仅用几个描述就能完成队大量数据的描述都去用数字的此处只是用gender字段为例
choices参数的概念它是一种以列表 / 元组的型式里面嵌套着少数几个小元组的方式表示一种对应关系
choices参数的用法
针对上述的用户信息表我们做以下修改将用户性别用整型去记录
# 创建userinfo表
class UserInfo(models.Model):username models.CharField(max_length32)age models.IntegerField()# 在此处我们用到choices参数# 先定义一个chocies参数的对应关系/其是就相当于是代表数字的说明与介绍choices_gender ((1, 男),(2, 女),)# 以上定义的choices列表就是下面gender字段的choices参数对应的一个对应关系此处choices这个列表也可以写成元组的形式根据个人爱好# 在我们将性别字设置成IntegerField类对象的时候将它的choices参数设置为我们上面定义的choices列表gender models.IntegerField(max_length2,choices choices_gender)提问如果我们向这个表中的gender字段存的值不在我们定义的choices列表中会怎么样呢?
# 向表中插入几条数据
models.UserInfo.objects.create(usernamejack,age18,gender1)
models.UserInfo.objects.create(usernamejerry,age18,gender2)
models.UserInfo.objects.create(usernametank,age18,gender3)总结如果存的数字是choices列表中的数字可以存进userinfo表存的数字不在choices列表中对应关系中也可以存
# 现在我们来查一下这张表中用户对应的gender字段的值。
user_obj_list models.UserInfo.objects.all()for user_obj in user_obj_list:print(f{user_obj.username}---{user_obj.age}---{user_obj.get_gender_display}) choices 参数用法总结
在定义choices这个对应关系的时候可以用列表套元组可以用字典套元组随意看自己心情自定义的这个对应关系的变量名choices可以换别的看你心情在往表中存数据时不管是不是对应关系中的内容都可以往表中存在查询使用choces参数的这个字段时想要查询这个字段的值必须用get_字段名_display()才能获取到正确的对应内容固定句式 数据对象.get_字段名_display() 当没有对应关系的时候 该句式获取到的还是数字
二、MVC与MTV模式
1.MVC
Web服务器开发领域里著名的MVC模式所谓MVC就是把Web应用分为模型(M)控制器©和视图(V)三层他们之间以一种插件式的、松耦合的方式连接在一起模型负责业务对象与数据库的映射(ORM)视图负责与用户的交互(页面)控制器接受用户的输入调用模型和视图完成用户的请求其示意图如下所示
2.MTV
Django的MTV模式本质上和MVC是一样的也是为了各组件间保持松耦合关系只是定义上有些许不同Django的MTV分别是值 ● M 代表模型Model 负责业务对象和数据库的关系映射(ORM)。 ● T 代表模板 (Template)负责如何把页面展示给用户(html)。 ● V 代表视图View 负责业务逻辑并在适当时候调用Model和Template。
除了以上三层之外还需要一个URL分发器它的作用是将一个个URL的页面请求分发给不同的View处理View再调用相应的Model和TemplateMTV的响应模式如下所示 一般是用户通过浏览器向我们的服务器发起一个请求(request)这个请求回去访问视图函数如果不涉及到数据调用那么这个时候视图函数返回一个模板也就是一个网页给用户视图函数调用模型模型去数据库查找数据然后逐级返回视图函数把返回的数据填充到模板中空格中最后返回网页给用户。
三、多对多的三种创建方式
注意多对多关系这种虚拟外键才有add、set、clear、remove一对一和一对多的表是无法使用的
1.全自动创建
class Book(models.Model):title models.CharField(max_length32)authorsmodels.ManyToManyField(toAuthor)
class Author(models.Model):name models.CharField(max_length32)优势自动创建第三张表并且提供了add、remove、set、clear四种操作
劣势第三张表无法创建更多的字段扩展性较差。如果我们有一些业务逻辑就是在关系表上我们就无法通过第三张表完成了。
2.纯手动创建
class Book(models.Model):title models.CharField(max_length32)
class Author(models.Model):name models.CharField(max_length32)
class Book2Author(models.Model):bookmodels.ForeignKey(toBook)author models.ForeigKey(toAuthor)othersmodels.CharField(max_length32)join_time models.DataField(auto_now_addTrue)优势第三张表完全由自己创建扩展性强
劣势编写繁琐并不支持add、remove、set、clear以及正反向概念
半自动创建
class Book(models.Model):title models.CharField(max_length32)authors models.ManyToManyField(toAuthor,throughBook2Author,through_fields(book,author)# 外键在哪个表就把book表放前面)
class Author(models.Model):name models.CharField(max_length32)
class Book2Author(models.Model):book models.ForeignKey(toBook, on_deletemodels.CASCADE)author models.ForeignKey(toAuthor, on_deletemodels.CASCADE)others models.CharField(max_length32)join_time models.DateField(auto_now_addTrue)优势第三张表完全由自己创建的扩展性强正反向概念依然可以使用
劣势编写繁琐不再支持add、remove、set、clear
四、Django与Ajax
1.什么是Ajax
AJAXAsynchronous Javascript And XML翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互传输的数据为XML当然传输的数据不只是XML。ajax不是一门新的技术而是一种使用现有标准的新方法。它本身又很多版本我们目前学习的是jQuery版本版本无所谓本质一样就可以。
功能介绍异步提交、局部刷新
优点
不重新加载整个页面的情况下可以跟服务器交换数据并更新部分网页内容。客户是感觉不到的只需要用户允许JavaScript在浏览器上执行。
1.AJAX使用JavaScript技术向服务器发送异步请求
2.AJAX请求无需刷新整个页面
3.因为服务器响应内容不再是整个页面而是页面中的部分内容所以AJAX性能高
4.两个关键点异步请求局部刷新常见的场景 搜索引擎会根据用户输入的关键字自动提示检索关键字。其实这里就使用了AJAX技术当文件框发生了输入变化时使用AJAX技术向服务器发送一个请求然后服务器会把查询到的结果响应给浏览器最后再把后端返回的结果展示出来。
这注册过程页面时没有刷新的只是刷新页面中我们鼠标点击的局部位置当请求发出后浏览器还可以进行其他操作无需等待服务器的响应。
Ajax案例
我们来做一个计算的例子
ajax.html
body
input typetext idinp1
input typetext idinp2
input typetext idinp3
button classbtn提交/buttonscript$(.btn).click(function () { //把提交按钮绑定一个点击事件var inp1 $(#inp1).val();var inp2 $(#inp2).val();//把获取到的两个值提交到后端让python来计算两个值然后返回$.ajax({url: , //默认不写是当前地址type: post, //提交方式默认是getdata: {inp1: inp1, inp2: inp2}, //朝后端提交的数据KV键值对形式//回调函数success用来接受后端返回的数据success:function (res){console.log(res) //打印后端返回的数据$(#inp3).val(res) //将接受到的数据返回到inp3中}})})
/script
/bodyviews.py
from django.shortcuts import render, HttpResponse
import json# Create your views here.def ajax(request):if request.method POST:接受ajax提交过来的数据d1 request.POST.get(inp1)d2 request.POST.get(inp2)d3 int(d1) int(d2) # 转为整型计算值print(request.POST) # QueryDict: {inp1: [1], inp2: [1]}return HttpResponse(json.dumps(d3)) # 序列化并返回给前端return render(request, ajax.html)这个时候需要拿到后端字典里的数据要怎么做 ajax.html
script$(.btn).click(function () { //把提交按钮绑定一个点击事件var inp1 $(#inp1).val();var inp2 $(#inp2).val();//把获取到的两个值提交到后端让python来计算两个值然后返回$.ajax({url: , //默认不写是当前地址type: post, //提交方式默认是getdata: {inp1: inp1, inp2: inp2}, //朝后端提交的数据KV键值对形式//回调函数success用来接受后端返回的数据success:function (res){console.log(res) //打印后端返回的数据{#resJSON.parse(res) //反序列化json格式数据如果后端是用JsonResponse返回数据就不需要前端反序列化#}console.log(res.username)console.log(res.password) //前度想要拿到某个值就需要反序列化后端别忘了序列化}})})
/scriptviews.py
from django.shortcuts import render, HttpResponse
import json
from django.http import JsonResponse# Create your views here.def ajax(request):if request.method POST:接受ajax提交过来的数据user_dic {username:jack,password:123}return JsonResponse(user_dic) # 序列化并返回给前端return render(request, ajax.html)