🌈🌈🌈🌈不定时的更新叒叒叕开始了,且更且珍惜🌈🌈🌈🌈

我要每次都写一遍:前面的还没补完,以此催促不定时更新的我
⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅⛅

 

主要内容

  MTV与MVC(了解)

多对多表三种创建方式

 

 

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


多对多表三种创建方式

  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.第二种纯手动创建第三张表

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查询

  3.第三种半自动创建第三张表(可扩展性高,并且能够符合orm查询)

class Book(models.Model):
  name = models.CharField(max_length=32)
  # 第三种创建表的方式
  authors = models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author'))
  # 可以建在Book表里也可以建在Author表里
class Author(models.Model):   name = models.CharField(max_length=32)   # book = models.ManyToManyField(to='Book',through='Book2Author',through_fields=('author','book')) class Book2Author(models.Model):   book = models.ForeignKey(to='Book')   author = models.ForeignKey(to='Author')   info = models.CharField(max_length=32)

 

前后端传输数据编码格式contentType

  我们可以通过浏览器右击检查-->network查看请求的具体信息

  其中contentType里面就标识了我们前后端传输数据的编码格式

  具体有以下三种格式👇:

  urlencoded(form表单与ajax默认的数据提交编码格式)

    对应的数据格式:name=jason&password=666,查看方式如下:

    

    后端获取数据:request.POST
    ps;django会将urlencoded编码的数据解析自动放到request.POST

  formdata传输文件

    回顾&补充:

      我们前面在传输文件的时候是通过enctype来指定编码格式,

    改成formdata,如果不指定的话,是没办法实现上传文件的。

    我们在后端通过request.POST可以看到,当你不指定enctype,

    里面获取到的仅仅是文件的名字,很明显不是我们想要的结果

    

      当指定enctype="multipart/form-data"时,后端通过request.FILES

    就可以获取到真实的文件了,这时候你再通过network去查看它的

    编码格式就发现变成了"multipart/form-data"

    

    总结:

    form表单传输文件的编码格式,支持传普通键值对也可以传文件
    后端获取文件格式数据:request.FILES
    后端获取普通键值对数据:request.POST

  application/json(ajax支持)

    ajax发送json格式数据
    需要注意的点:编码与数据格式要一致    

    JSON.stringify({'name':'jason'})
    django后端对于json格式的数据不做任何处理,

    就将原生的二进制数据存在request.body中,让你自己手动处理
    先解码再反序列化

ajax

  1.前端有哪些方式可以朝后端发请求

    浏览器窗口手动输入网址 get请求
    a标签的href属性 get请求
    form表单 get/post请求(默认是get请求)
    ajax :get/post请求

  2.ajax特点:

    异步提交(github注册示例)
    局部刷新

  3.ajax基本语法(四个基本参数)

    url:'', # 控制数据提交的地址,不写默认往当前位置提交
    type:'get', # 控制的是数据的提交方式 get,post,。。。
    data:{'name':'jason'} # 提交的数据
    success:function(data){
      # 做局部刷新的操作
      alert(data)
    }

    
$('#d1').click(function () {
    $.ajax({
        // 提交的地址
        url:'/index/',
        // 提交的方式
        type:'post',
        // 提交的数据
        data:{'name':'jason','password':'123'},
        // 回调函数
        success:function (data) { 
            // data接收的就是异步提交返回的结果
            alert(data)
           }
      })
})        
ajax示例

  4.ajax默认传输数据的编码格式也是urlencoded


  5.前后端传输数据

    你不能骗人家,数据是什么格式就应该告诉别人是什么格式

    (数据与编码要一一对应)
  🔹ajax传输json格式数据

    1.利用一个js内置对象FormData
    2.这个FormData即可以传普通的键值也可以传文件
    3.需要修改两个默认参数processData,contentType
    4.获取input框存储的文件数据$('input[type="file"]')[0].files[0]

    
$('#d1').click(function () {
  $.ajax({
    url:'', // url参数可以不写,默认就是当前页面打开的地址
    type:'post',
    contentType:'application/json',
    data:JSON.stringify({'name':'jason','hobby':'study'}),
    success:function (data) {
      {#alert(data)#}
      {#$('#i3').val(data)#}
    }
  })
});
ajax传输json格式数据

    views.py

    def test1(request):
        if request.method == 'POST':
            import json
            # 编码改成application/json之后,传输过来的是二进制数据,存在request.body中
            dic = json.loads(request.body.decode('utf-8'))
            print(dic, type(dic))
            return HttpResponse('get it')
        return render(request, 'test1.html')

  🔹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)
      }
    })
  });
ajax传输文件

 

    views.py

    def test1(request):
        if request.method == 'POST':
            # 没有普通键值对,所以request.POST是空
            print(request.POST)
            print(request.FILES)
            # request.FIlES.get('file')拿出来的是文件对象
            file_obj = request.FILES.get('file')
            # 保存文件至本地
            with open(file_obj.name, 'wb') as f:
                for line in file_obj:
                    f.write(line)
            return HttpResponse('get it')
        return render(request, 'test1.html')

 

  🔹form表单与ajax异同点
    1.form表单不支持异步提交局部刷新
    2.form表单不支持传输json格式数据
    3.form表单与ajax默认传输数据的编码格式都是urlencoded

  注:虽然ajax有很多好处,但是并不代表你全都使用ajax就是好的,

    当你频繁朝服务端发送请求的时候,量达到一定程度,

    容易导致服务端崩掉。


批量插入数据

l = []
for i in range(10000):
  l.append(models.Book2(name='第%s本书'%i))
models.Book2.objects.bulk_create(l) # 批量插入数据

补充1:当列表中的数据过多是,也会占很大的空间,那能否有一个方法,

   可以实现我用一个就取一个,就不用全部取出,从而节省空间呢?

   💡这时候我们想到了之前学过的生成器正好具有这样的特点

   g = (models.User(name='%s'%i)  for i in range(1000000))


补充2:<li><a href="?page=1">1</a></li> # 自动补全当前路径


自定义分页器


  自定义分页器的使用

  后端:

book_list = models.Book2.objects.all()
# 数据总条数
all_count = book_list.count()
# 当前页
current_page = request.GET.get('page',1)
# 示例一个分页器对象
page_obj = my_page.Pagination(current_page=current_page,all_count=all_count)
# 对总数据进行切片
page_queryset = book_list[page_obj.start:page_obj.end]

  前端:

将book_list全部替换为book_queryset
渲染分页器样式
{{ page_obj.page_html|safe }}

 

有待持续改善,增加内容(如:利用ajax实现两个input框的数据相加的结果渲染到第三个input框内)

................

先写成这样

👻👻👻👻👻