一、MTV 与 MVC
MTV模型(django):
M:模型层(models.py)
T:templates
V:views
MVC模型:
M:模型层(models.py)
V:视图层(views.py)
C:控制器(Controller) urls.py
本质:django的MTV也是MVC
二、多对多关系 表的三种创建方式
第一种: django orm 自动帮我们创建 在第三张表里,无法添加其他字段了
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
可以通过对象去查询,也可通过双下划线去查询
第二种: 手动去创建三张表
class Book(models.Model):
name = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
info = models.CharField(max_length=32) #可手动添加其他字段
无法通过orm里的对象去查询,但是可以用双下划线通过第三张表做中介间接去查到数据
第三种:半自动去创建三张表 (推荐使用) 可扩展性高,并且能够符合orm查询
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author'))
#注意上述代码的书写,三个关键字,还有,多对多关系写在这,那么Book就是主动的,注意book要写在前面
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
info = models.CharField(max_length=32)
django 里无论是对象的正反向查询,还是双下划线的正反向查询,均可得到数据
res1 = models.Book.objects.filter(pk=1).first().authors.all() #正向查
res2 = models.Author.objects.filter(pk=1).first().book_set.all() #反向查
res3 = models.Author.objects.filter(pk=1).values('book__authors__book') #正向查
res4 = models.Book.objects.filter(pk=1).values('authors__book2author__book') #反向查
三、前后端 form表单 传输数据的编码格式
前后端传输数据编码格式contentType
1、urlencoded 默认
前端对应的数据格式:name=jason&password=666
后端获取数据:request.POST
ps;django会将urlencoded编码的数据解析自动放到request.POST
当传文件时:
前端拿到的只是文件的名字
后端拿到的 同样是一个键值对
2、form-data 在form表单里手动修改
enctype="multipart/form-data"
前端看不到on,被藏起来了
指定了form表单传输文件的编码格式
后端获取文件格式数据:request.FILES
]}>
后端获取普通键值对数据:request.POST
form表单支持上述两种编码格式
还存在一种编码格式: 不过form表单不支持
application/json
ajax发送json格式数据
需要注意的点
编码与数据格式要一致 content:'application/json'
四、前端朝后端发请求的方式
浏览器窗口手动输入网址 get请求
a标签的href属性 get请求
form表单 get/post请求(默认是get请求)
ajax get/post请求
五、ajax的准备知识:json
json介绍:
1、JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
2、JSON 是轻量级的文本数据交换格式
3、JSON 独立于语言
4、JSON 具有自我描述性,更易理解
5、 JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
合格的json对象 (json对象只认双引号的字符串格式):
["one", "two", "three"] { "one": 1, "two": 2, "three": 3 } {"names": ["张三", "李四"] } [ { "name": "张三"}, {"name": "李四"} ]
不合格的json对象:
{ name: "张三", 'age': 32 } // 属性名必须使用双引号 [32, 64, 128, 0xFFF] // 不能使用十六进制值 { "name": "张三", "age": undefined } // 不能使用undefined { "name": "张三", "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'), "getName": function() {return this.name;} // 不能使用函数和日期对象 }
stringify 与 parse 方法
JavaScript中关于JSON对象和字符串转换的两个方法:
JSON.parse(): 用于将一个 JSON 字符串转换为 JavaScript 对象(json只认双引的字符串格式)
JSON.parse('{"name":"Howker"}'); JSON.parse('{name:"Stack"}') ; // 错误 JSON.parse('[18,undefined]') ; // 错误
JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。
JSON.stringify({"name":"Tonny"})
六、ajax
1.ajax特点:
异步提交 提交任务完后,该干啥就干啥
局部刷新 部分内容刷新
2、ajax基本语法
提交的地址(url)
提交的方式(type)
提交的数据(data)
回调函数(success)
$('#d1').click(function () {
$.ajax({
// 提交的地址
url:'/index/',
// 提交的方式
type:'post',
// 提交的数据
data:{'name':'michael','password':'123'},
// 回调函数
success:function (data) { // data接收的就是异步提交返回的结果
alert(data)
}
})
})
3.ajax默认传输数据的编码格式也是urlencoded
此时在前端的检查页面,可见 Form Data 为 name=michael&password=123
4、前后端传输数据 数据与编码要一一对应。 request.POST 拿不了json类型的数据
ajax传输json格式数据 其数据放在request.body里 b'{"name":"michael","hobby":"read"}'
$('#d1').click(function () {
$.ajax({
url:'', // url参数可以不写,默认就是当前页面打开的地址
type:'post',
contentType:'application/json',
data:JSON.stringify({'name':'michael','hobby':'ready'}),
success:function (data) {
{#alert(data)#}
{#$('#i3').val(data)#}
}
})
});
后端拿到数据是字节类型,处理前先转码为字符串
data = request.body
res1 = data.decode('utf-8') #方式一
res2 = str(data,encoding='utf-8') #方式二
若 将字符串转成json类型的字典
import json
res3 = json.loads(res2)
5.ajax传输文件
$('#d1').click(function () {
let formdata = new FormData();
// FormData对象不仅仅可以传文件还可以传普通的键值对
formdata.append('name','jason');
// 获取input框存放的文件
//$('#i1')[0].files[0]
formdata.append('myfile',$('#i1')[0].files[0]);
$.ajax({
url:'',
type:'post',
data:formdata,
// ajax发送文件需要修改两个固定的参数
processData:false, // 告诉浏览器不要处理我的数据
contentType:false, // 不要用任何的编码,就用我formdata自带的编码格式,django能够自动识别改formdata对象
// 回调函数
success:function (data) {
alert(data)
}
})
});
普通的键值放在request.POST 里
文件相关的放在request.FILES
6.ajax与form表单的异同点:
1.form表单不支持异步提交局部刷新
2.form表单不支持传输json格式数据
3.form表单与ajax默认传输数据的编码格式都是urlencoded