# 上节回顾
```python
1 路由匹配从上往下匹配,一旦匹配成功,就不再往下匹配
re_path(r'^$', book.index),
2 反向解析
-用在模板中
-用在视图函数中
3 图片列表之作者显示(for循环中套if),for+empty的使用
<td>
{% for author in book.authors.all %}
{% if forloop.last %}
{{ author.name }}
{% else %}
{{ author.name }} -- |--
{% endif %}
{% empty %}
未知作者
{% endfor %}
</td>
4 图书编辑的连接
-<td><a href="/boo_update/{{book.id}}/">编辑</a></td>
-<td><a href="{% url 'bookupdate' book.id %}/">编辑</a></td>
-<td><a href="/boo_update/?pk={{book.id}}">编辑</a></td>
5 模板变量可以给js使用
python中
ss='lqz'
<script>
var a='{{sss}}'
var a=lqz
</script>
6 修改,出版社跟图书真正的出版社对应
<select class="form-control" name="publish">
{% for publish in publishs %}
{% if book.publish.id == publish.id %}
<option value="{{ publish.id }}" selected>{{ publish.name }}</option>
{% else %}
<option value="{{ publish.id }}">{{ publish.name }}</option>
{% endif %}
{% endfor %}
</select>
7 修改,作者
<select multiple class="form-control" name="authors">
{% with book.authors.all as xxx %}
{% for author in authors %}
{% if author in xxx %}
<option value="{{ author.id }}" selected>{{ author.name }}</option>
{% else %}
<option value="{{ author.id }}">{{ author.name }}</option>
{% endif %}
{% endfor %}
{% endwith %}
</select>
8 修改作者与图书的关系
models.Book.objects.filter(pk=pk).update(name=name, price=price, publish_date=publish_date, publish_id=publish)
book=models.Book.objects.get(pk=pk)
book.authors.set(authors) # 传对象,传id都可以
# book.authors.clear()
# book.authors.add(*authors)
# django基础部分(没讲)
-choice的用法
-批量插入
-多对多关联关系的三种方式:中介模型(手动创建还是自动创建第三张表)******
-related_name,related_query_name (放在关联关系对象中的参数)ForeignKey(related_name='xx')
```
# 今日内容
## 1 ajax介绍
```python
# 1 异步 Javascript 和 XML:
-异步:跟同步是对应的
-javascript:通过javascript来操作,发送请求 ,到服务端
-xml:数据交互使用xml,现在主流使用json格式
-xml:可阅读性比较高,解析复杂,占的空间大
<name>lqz</name>
<age>19</age>
-json:可阅读性比较高,解析简单,占的空间小
{"name":"lqz","age":19}
-浏览器页面局部刷新(js的dom操作)
-通过js发送http的请求(go,java,php,requset)
# 2 同步和异步
#3 IAAS,PAAS,SAAS
# 4 同步交互和异步交互
同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
```
#
## 2 ajax的简单使用
```python
1 原生js写ajax请求(写起来很复杂,而且需要考虑浏览器版本)
2 jquery帮咱们封装好了一个方法 ajax,我们直接调用jquery的方法,就可以发送ajax的请求
3 后期,前后端分离了,还可以继续使用jquery的ajax, axios更主流一些
4 现在我们学的jquery的ajax方法的使用
5 需求:通过Ajax,实现前端输入两个数字,服务器做加法,返回到前端页面
6 模板
$.ajax({
url: '/add/',
method: 'post',
data:{'a':$("#first").val() ,'b':$("#second").val() },
success:function (data) {
//成功触发
},
error:function (error) {
//失败,触发
}
})
# 默认清空下ajax会把{'a':$("#first").val() ,'b':$("#second").val() }数据转成
# 预处理数据
a=20&b=30,放到body体中
# 编码默认用urlencoded
```
## 3 ajax上传文件
```python
1 http请求,body体中放文件内容,ajax本质就是发送http请求,所以它可以上传文件
2 两种上传文件的方式,form表单,ajax
3 固定模板
var formdata=new FormData()
formdata.append('myfile',$("#id_file")[0].files[0])
# 还可以带数据
$.ajax({
url:'/uploadfile/',
method: 'post',
//上传文件必须写这两句话
processData:false, # 预处理数据,
contentType:false, # 不指定编码,如果不写contentType,默认用urlencoded
data:formdata, # formdata内部指定了编码,并且自行处理数据
success:function (data) {
console.log(data)
}
})
```
## 4 ajax提交json格式
```python
$.ajax({
url:'/uploajson/', //写全,是什么样就写什么样
method:'post',
contentType: 'application/json',
//data要是json格式字符串
//data:'{"name":"","password":""}',
//把字典转成json格式字符串
//JSON.stringify(dic)
//把json格式字符串转成对象
//JSON.parse(data)
data:JSON.stringify({name:$("#id_name1").val(),password:$("#id_password1").val()}),
success:function (data) {
//返回字符串类型,需要转成js的对象,字典
//1 如果:django 返回的是HttpResponse,data是json格式字符串,需要自行转成字典
//2 如果:django 返回的是JsonResponse,data是就是字典
//ajax这个方法做的是,如果响应数据是json格式,自动反序列化
console.log(typeof data)
var res=JSON.parse(data)
console.log(typeof res)
console.log(res.status)
console.log(res.msg)
}
})
```
## 5 django内置序列化器(了解,不好用,后面有更好的)
```python
1 把对象转成json格式,json.dumps实现不了,
2 django内置了一个东西,可以把对象转成json格式
from django.core import serializers
book_list = Book.objects.all()
ret = serializers.serialize("json", book_list) # ret就是json格式字符串
ll=[]
for book in book_list:
ll.append({'name':book.name,'price':book.pirce})
import json
ret=json.dumps(ll)
return HttpResponse(ret)
```
# 拓展
## 1 js逆向,混淆和压缩
# 作业
```python
## 1 整理ajax知识点
## 2 (使用ajax实现)用户在表单输入用户名与密码,通过Ajax提交给服务器,服务器验证后返回响应信息,客户端通过响应信息确定是否登录成功,成功,则跳转到首页,否则,在页面上显示相应的错误信息
(坑:在form表单中写button,input的submit,用jquery,操作button),会发两次请求
## 3 使用ajax和form表单两种方式上传文件,保存到项目跟路径下的media文件加
## 4 使用ajax提交json格式数据
## 5 (拓展)实现简单的注册功能,当光标移除用户名的输入框,去后端校验,如果用户名存在,提示错误,并且把输入框中的文字清除
## 6 内置的序列化器把对象转成json返回给前端,自行实现对象转josn,返回前端
```