python学习Day62
Day 62
今日内容概要
- 图书管理系统讲解
- AJAX简介
- 基础语法
- 数据编码格式
- ajax携带文件数据
- 回调函数
- Django内置的序列化serializers模块
今日内容详细
一.图书管理系统讲解
1.数据准备
2.首页搭建
3.书籍展示
4.书籍添加
5.书籍编辑
6.书籍删除
数据准备
1.新建django文件 注意新建一个app01应用
(1)settings.py中检查INSTALLED_APPS中app01有没有注册
(2)MIDDLEWARE中的csrf注释掉
(3)TEMPLATES中'DIRS':[os.path.join(BASE_DIR,'templates')]
2.把django中的数据库改为mysql
(1)cmd>mysql>create databas 库名 #创建一个数据库
(2)settings.py中把DATABASES中的'sqlite3'改为'mysql'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'day62',
'USER':'root',
'PASSWORD':'123',
'HOST':'127.0.0.1',
'PORT':3306,
'CHARSET':'utf8'}}
(3)settings.py中最下方配置静态文件
STATICFILES_DIRS=[os.path.join(BASE_DIR,'static')]
然后在day62下创建一个static文件夹
3.models.py中创建4张表格式
class Book(models.Model):
"""图书表"""
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=8,decimal_places=2)
publish_time=models.DateField(auto_now=True)
publish=models.ForeignKey(to='Publish',on_delete=models.CASCADE)#一对多字段
authors=models.ManyToManyField(to='Author',)#多对多字段
def __str__(self):
return f'书籍对象:{self.title}'
class Publish(models.Model):
"""出版社表"""
name=models.CharField(max_length=32)
addr=models.CharField(max_length=64)
def __str__(self):
return f'出版社对象:{self.name}'
class Author(models.Model):
"""作者表"""
name=models.CharField(max_length=32)
age=models.IntegerField()
author_detail=models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)#一对一字段
def __str__(self):
return f'作者对象:{self.name}'
class AuthorDetail(models.Model):
"""作者详情表"""
phone=models.BigIntegerField()
address=models.CharField(max_length=64)
def __str__(self):
return f'作者详情对象:{str(self.phone)}|{self.address}'
4.执行数据库迁移/同步命令
Ctrl+Alt+R
makemigrations
migrate
5.连接数据库
user、password、要连接的库、测试一下是否成功、应用后确定
6.给作者表、作者信息表、出版社表添加数据
二.AJAX简介
ajax(Asynchronous Javascript And XML)翻译成中文就是"异步的Javascript和XML".即使用Javascript语言与服务器进行异步交互,传输的数据为XML
ajax是js(Javascript)自带的功能,是jQuery封装之后版本
特点:#异步提交 局部刷新
最大的优点:在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容
与form表单的区别:类似于注册账号时输入用户名,还没点提交 系统就显示出来是否被注册过
同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求
1.基础语法
$.ajax({
url:'', #控制数据的提交地址(不写就是当前页面地址) 等价于form表单的action参数
type:'', #控制请求方式(默认get请求 注:小写) 等价于form表单的method参数
data:{}, #组织提交的数据
success:function(形参){ #后端接收到了请求,且给出了一定的反馈就会触发该函数。形参就是用于接收后端返回的数据
异步回调函数
}
})
2.数据编码格式
格式 | 数据格式 | 说明 |
---|---|---|
urlencoded | name=jason&pwd=123&hobby=read | django后端统一处理到request.POST中 |
formdata | 二进制 无法查阅 | django后端自动将文件数据处理到request.FILES 普通数据到request.POST |
application/json | json格式 | django后端不会处理 在request.body中存储(bytes类型),需自己做JSON字符串类型转换处理 |
第三种格式语法注意事项:
data: JSON.stringify({'name':'jason','pwd':123}),
contentType:'application/json',
3.ajax携带文件数据
$('#d3').click(function () {
// 1.产生内置对象
let formData = new FormData();
// 2.添加普通数据
formData.append('username',$('#d1').val())
// 3.添加文件数据
formData.append('file', $('#d2')[0].files[0])
// 4.发送ajax请求
$.ajax({
url:'',
type:'post',
data:formData,
contentType:false, // 不使用任何编码#(只要携带文件就要加该参数)
processData:false, // 不处理数据对象#(只要携带文件就要加该参数)
success:function (args) {
}
})
})
#ajax不能接受后端数据传来的页面跳转,因为是局部改变
4.回调函数
后端跟ajax交互 不应该再返回页面 通常情况下都是返回json格式数据
前端针对HttpResponse和JsonResponse返回的json格式数据处理策略不同
前者不会自动反序列化 而后者会自动反序列化
如果想让前者也自动反序列化可以添加一个固定的参数:dataType:'JSON'
三.Django内置的序列化serializers模块
前端想拿到由ORM得到的数据库里一个个用户对象,想从后端直接实例化出来的数据对象发送给客户端,就需要Django提供的序列化方式:
def ser(request):
#拿到用户表里面的所有的用户对象
user_list=models.User.objects.all()
#导入内置序列化模块
from django.core import serializers
#调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
ret=serializers.serialize('json',user_list)
return HttpResponse(ret)
'该方式对数据多的时候不适用'
作业
1.将删除按钮的二次确认改为ajax形式
2.优化删除二次确认 使用sweetalert