zoukankan      html  css  js  c++  java
  • MTV与MVC 多对多表的创建方式 前后端传输数据编码格式 ajax 批量插入数据 自定义分页器

    一、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
    		
    		当传文件时:
    		  前端拿到的只是文件的名字
    		  后端拿到的 同样是一个键值对  <QueryDict: {'name': ['json'], 'age': ['28'], 'file': ['数据库day06课堂笔记.md']}>
    		
    		
    		
    	2、form-data  在form表单里手动修改	
    	enctype="multipart/form-data"
    	
    		前端看不到on,被藏起来了
    	
    		指定了form表单传输文件的编码格式
    		后端获取文件格式数据:request.FILES     
    		<MultiValueDict: {'file': [<InMemoryUploadedFile: 数据库day06课堂笔记.md (application/octet-stream)>]}>
    		后端获取普通键值对数据:request.POST
    		<QueryDict: {'name': ['老李'], 'age': ['28']}>
    		
    		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类型的数据  <QueryDict: {}>
    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

      

  • 相关阅读:
    Beta 答辩总结
    Beta 冲刺 (7/7)
    Beta 冲刺 (6/7)
    Beta 冲刺 (5/7)
    Beta 冲刺 (4/7)
    Beta 冲刺 (3/7)
    软件产品案例分析(团队)
    概率图模型7:条件随机场(2)
    推荐系统概述3
    概率图模型6:条件随机场(1)
  • 原文地址:https://www.cnblogs.com/changwenjun-666/p/11025437.html
Copyright © 2011-2022 走看看