zoukankan      html  css  js  c++  java
  • Django--多对多表的创建、contentType、ajax、ajax传输json数据格式、ajax传输文件数据、 自定义分页器

    MTV与MVC(了解):

      MTV模型(Django用的就是MTV):

        M:模型层(models.py)

        T:templates

        C: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、第二种手动创建第三张表

      3、第三种半自动创建第三张表

    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)
    
    
    class Book2Author(models.Model):
        book = models.ForeignKey(to="Book")
        author = models.ForeignKey(to="Author")
        info = models.CharField(max_length=32)

      

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

      urlencoded:对应的数据格式:name=jason&password=666

        后端获取获取数据:request.POST

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

      formdata:

        form表单用来传输文件的编码格式

        后端获取文件格式的数据:request.FILES

        后端获取普通键值对的数据:request.POST

      application/json:

    ajax:(https://www.cnblogs.com/Dominic-Ji/p/9234099.html)

       AJAXAsynchronous Javascript And XML)翻译成中文就是异步的JavascriptXML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

      AJAX最大的优点就是在不重新加载整个页面的情况下,可以和服务器交换数据并更新部分网页的内容。(这一个特点给用户的感受是在不知不觉中就完成了请求和响应的过程)

      AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

      同步交互:客户端发出一个请求后,需要等地服务器响应结束后,才能发出第二个请求

      异步交互:客户端发出一个请求后,不需要等待服务器响应结束,就可以发出第二个请求

      前端朝后端发送请求的方式:

        1、浏览器手动输入网址  get请求

        2、a标签的form属性  get请求

        3、form表单  get/post请求(默认是get请求)

        4、ajax  get/post请求

      ajax简单用法

        ajax基本语法:

          必须有的四个东西:提交的地址url(可以不写,默认就是当前页面打开的地址)、提交的方式type、提交的数据data、回调函数success

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

        $('#d1').click(function () {
            $.ajax({
                url: '/index/',
                type: 'post',
                data: {'name': 'william', 'password': '123'},
                success:function (data) {
                    alert(data)
            }
            })
        })

      ajax传输json格式的数据

        application/json

        需要注意的点:

          编码与数据格式要一致

        前端:

    $('#d1').click(function () {
            $.ajax({
                url: '/index/',
                type: 'post',
                contentType: "application/json",
                data: JSON.stringify({"name": 'william', 'password': '123'}),
                success:function (data) {
                    alert(data)
            }
            })
        })

        后端:

    import json
    
    data = request.body
    res = data.decode('utf-8')
    res = json.loads(res)

      ajax传输文件数据

        ajax传输文件必须借助于内置对象Formdata

        前端:

    $("#b1").click(function () {
            let formData = new FormData();
            formData.append('标签中的name', $('#i1')[0].files[0]);
            $.ajax({
                url: '',
                type: 'post',
                processData: false,  // 告诉jquery不要去处理发送的数据
                contentType: false,  // 告诉jquery不要去设置Content-Type请求头
                data: formData,
                success:function (data) {
                    console.log(data)
                }
            })
        })

        后端:

    def upload(request):
        if request.method == 'POST':
            print(request.POST)
            file_obj = request.FILES.get('标签中的name')
            with open(file_obj.name, 'wb') as f:
                for chunk in file_obj.chunks():
                    f.write(chunk)
            return HttpResponse('ok')
    
        return render(request, 'upload.html')

        form表单与ajax的异同点:

          1、form表单不支持异步提交局部刷新

          2、form表单不支持传输json格式数据

          3、form表单与ajax默认传输数据格式都是urlencoded

      

    批量插入数据:

      首先在外面创建一个列表用来保存数据对象,然后通过bulk_create()方法来直接将可迭代对象一次性插入到数据库中,节省了大量的时间

    l = []
    for i in range(10000):
        l.append(models.Book2(name='第%s本书' % i))
    models.Book2.object.bulk_create(l)

      

      

    自定义分页器:

    current_page = request.GET.get('page', 1)
    page_obj = my_page.Pagination(current_page, all_count)
    page_queryset = book_list[page_obj.start:page_obj.end]

      页码的渲染通常都是单数,符合中国人的审美标准

      需要完善的:

        1、需要加上首页和尾页

      补充:

    <li><a href="?page=1">1</a></li>  // href默认前面会自动补全

       

      

      

  • 相关阅读:
    LoadRunner如何监控Linux下的系统资源
    shareeverything and sharenothing原理区别
    LoadRunner下如何监控Windows系统资源
    简明 Vim 练级攻略
    自由地使用那10000个Web协议的License进行压力测试
    自己做的西直门桥
    Visual Studio问题解答(不断更新)
    记2012微软编程之美全国挑战赛
    matlab也能创作歌曲
    拈游戏
  • 原文地址:https://www.cnblogs.com/tulintao/p/11436490.html
Copyright © 2011-2022 走看看