Django--多对多表的创建、contentType、ajax、ajax传输json数据格式、ajax传输文件数据、 自定义分页器
MTV与MVC(了解):
MTV模型(Django用的就是MTV):
M:模型层(models.py)
T:templates
C:views
MVC模型:
M:模型层(models.py)
V:视图层(views.py)
C:控制层(Controller)urls.py
本质:Django的MTV本质上其实也是MVC
多对多表的三种创建方式:
1、第一种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)
2、第二种手动创建第三张表
3、第三种半自动创建第三张表
class Book(models.Model): name = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book', 'author')) 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)
前后端传输数据编码格式contentType:
urlencoded:对应的数据格式:name=jason&password=666
后端获取获取数据:request.POST
ps:django会将urlencoded编码的数据解析自动放到request.POST
formdata:
form表单用来传输文件的编码格式
后端获取文件格式的数据:request.FILES
后端获取普通键值对的数据:request.POST
application/json:
ajax:(https://www.cnblogs.com/Dominic-Ji/p/9234099.html)
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。
AJAX最大的优点就是在不重新加载整个页面的情况下,可以和服务器交换数据并更新部分网页的内容。(这一个特点给用户的感受是在不知不觉中就完成了请求和响应的过程)
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
同步交互:客户端发出一个请求后,需要等地服务器响应结束后,才能发出第二个请求
异步交互:客户端发出一个请求后,不需要等待服务器响应结束,就可以发出第二个请求
前端朝后端发送请求的方式:
1、浏览器手动输入网址 get请求
2、a标签的form属性 get请求
3、form表单 get/post请求(默认是get请求)
4、ajax get/post请求
ajax简单用法
ajax基本语法:
必须有的四个东西:提交的地址url(可以不写,默认就是当前页面打开的地址)、提交的方式type、提交的数据data、回调函数success
ajax默认传输数据的编码格式也是urlencoded
$('#d1').click(function () {
$.ajax({
url: '/index/',
type: 'post',
data: {'name': 'william', 'password': '123'},
success:function (data) {
alert(data)
}
})
})
ajax传输json格式的数据
application/json
需要注意的点:
编码与数据格式要一致
前端:
$('#d1').click(function () { $.ajax({ url: '/index/', type: 'post', contentType: "application/json", data: JSON.stringify({"name": 'william', 'password': '123'}), success:function (data) { alert(data) } }) })
后端:
import json data = request.body res = data.decode('utf-8') res = json.loads(res)
ajax传输文件数据
ajax传输文件必须借助于内置对象Formdata
前端:
$("#b1").click(function () { let formData = new FormData(); formData.append('标签中的name', $('#i1')[0].files[0]); $.ajax({ url: '', type: 'post', processData: false, // 告诉jquery不要去处理发送的数据 contentType: false, // 告诉jquery不要去设置Content-Type请求头 data: formData, success:function (data) { console.log(data) } }) })
后端:
def upload(request): if request.method == 'POST': print(request.POST) file_obj = request.FILES.get('标签中的name') with open(file_obj.name, 'wb') as f: for chunk in file_obj.chunks(): f.write(chunk) return HttpResponse('ok') return render(request, 'upload.html')
form表单与ajax的异同点:
1、form表单不支持异步提交局部刷新
2、form表单不支持传输json格式数据
3、form表单与ajax默认传输数据格式都是urlencoded
批量插入数据:
首先在外面创建一个列表用来保存数据对象,然后通过bulk_create()方法来直接将可迭代对象一次性插入到数据库中,节省了大量的时间
l = [] for i in range(10000): l.append(models.Book2(name='第%s本书' % i)) models.Book2.object.bulk_create(l)
自定义分页器:
current_page = request.GET.get('page', 1) page_obj = my_page.Pagination(current_page, all_count) page_queryset = book_list[page_obj.start:page_obj.end]
页码的渲染通常都是单数,符合中国人的审美标准
需要完善的:
1、需要加上首页和尾页
补充:
<li><a href="?page=1">1</a></li> // href默认前面会自动补全