• Django之MTV与MVC及AJAX


    一、MTV与MVC

    1、MTV模型(Django):

    M:模型层(models.py)

    T:模板层 (templates)(HTML文件存放处)

    V:视图层(views)

     

    2、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)

    3、半自动创建第三张表(可拓展性高,并且能够符合ORM查询)

    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)
        # 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)

    三、AJAX

    1、前端向后端发请求的方法:

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

    2、Ajax特点:

    • 异步提交
    • 局部刷新

    3、Ajax基本语法

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

    4、Ajax默认传输数据的编码格式也是urlencoded

    5、前后端传输数据

    • 数据与编码要一一对应

    5.1、Ajax传输json格式数据

        $('#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)#}
                }
            })
        });        

    5.2、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)
            }
        })
    });

    补充:1、form表单与Ajax的异同点

    • form表单不支持异步提交局部刷新
    • form表单不支持传输json格式数据
    • form表单与ajax默认传输数据的编码格式都是urlencoded

       2、批量插入数据

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

    注意:

    <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]
            
    
    # 前端
        {{ page_obj.page_html|safe }}  # 帮你渲染的是带有bootstrap样式的分页器
  • 相关阅读:
    Struts2获取参数的几种方式
    Struts2的Action中访问servletAPI方式
    struts2中常用配置
    struts2发送ajax的几个问题(不使用struts2-json-plugin的情况下)
    深入Struts2的过滤器FilterDispatcher--中文乱码及字符编码过滤器
    Ironic 裸金属实例的部署流程
    Ironic 裸金属管理服务的底层技术支撑
    Cinder AZ 与 Nova AZ 的同步问题
    OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题
    OpenStack 节点重启后无法联网的问题
  • 原文地址:https://www.cnblogs.com/wangyisen/p/11024447.html
Copyright © 2020-2023  润新知