django ajax 及批量插入数据 分页器

```
Ajax
前端朝后端发送请求都有哪些方式
    a标签href                GET请求
    浏览器输入url            GET请求
    form表单                GET/POST请求
    Ajax                    GET/POST请求
    
前端朝后端发送数据的编码格式
    contentType参数,用来表示前端朝后端发送数据的编码格式
        urlencoded:name=jason&pwd=123  request.POST  # urlencoded是form表单和ajax提交数据默认的编码方式
        formdata:request.FILES
        appliction/json:request.body   bytes格式

ajax特点:
    1.异步提交
    2.局部刷新
    
ajax与form表单的不同点:
    1.form表单提交的数据格式只能是urlencoded和formdata,它不支持json格式数据
    2.form表单提交数据,页面会刷新
    3.ajax局部刷新,异步提交,并且支持发送json格式数据
```

​    

```
小需求:页面上渲染三个input前两个输入数字,点击计算按钮,第三个得出两者之和
前端代码:
    <input type='text' id='i1'/> + <input type='text' id='i2'/> = <input type='text' id='i3'/>
    <button id='b1'></button>
    # ajax初识
        $('#b1').click(function () {
                $.ajax({
                    url:'',
                    type:'POST',
                    data:{i1:$('#i1').val(),i2:$('#i2').val()},
                    success:function (data) {
                        $('#i3').val(data)
                    }
                })
            })

ajax提交数据必备的几个参数
    1.往哪提交        ulr控制
    2.提交方式        type控制
    3.提交的数据    data
    4.提交后端处理之后的结果    success:function(){}
    
     $.ajax({
        // 前面的变量值都是固定写法,url,type,data
        url:'',  // 提交的路径
        type:'post',  // 提交的方式
        data:{'name':'jason'},  // 提交的数据  # 默认数据传输默认也是urlencoded编码格式
        success:function (data) {  // 回调函数,会将后端处理好的数据传给data形参
            alert(data)
        }
    })

ajax提交json格式数据
    1.需要告诉后端此次发送的数据为json格式
    2.告诉后端数据时什么格式,你在传的时候,数据就应该对应是什么格式
$('#d1').click(function () {
    $.ajax({
        // 前面的变量值都是固定写法,url,type,data
        url:'',  // 提交的路径
        type:'post',  // 提交的方式
        data:JSON.stringify({'name':'jason','age':'18'}),  // 提交的数据
        contentType:'application/json',  // 告诉后端当前数据的格式为json格式  # 编码格式与数据类型必须一致,不能骗人!
        success:function (data) {  // 回调函数,会将后端处理好的数据传给data形参
            $('#i3').val(data)
        }
    })
})
```

​    
​    

```
request.POST只能解析 编码格式为urlencoded以及text/plain
```

​    

```
ajax传文件(固定写法!)

几个必须注意点:
    1.必须用内置对象:new FormData
    2.获取input框文件对象:$('#i1')[0].files[0]
    3.指定两个参数为false:
        processData:false,  // 不要处理我的数据 name=jason&password=123
        contentType:false,  // 不需要指定任何编码,就按照我的formdata内部的数据格式即可
    4.后端按正常的文件上传从request.FILES里面获取文件对象
    5.formdata也支持传普通的键值对,后端仍然可以在request.POST里面获取到
    
    $("#btn").click(function () {
            //上传文件,必须用FormData,生产一个formdata对象
            var formdata=new FormData();
            formdata.append('name',$("#name").val()); # 也支持传键值对的数据
            //取出文件$("#myfile")[0].files拿到的是文件列表,取第0个把具体的文件取出来
            formdata.append('myfile',$("#myfile")[0].files[0]);
            $.ajax({
                url:'/index/',
                type:'post',
                //不预处理数据,(name=lqz&age=18)
                processData:false,
                //指定往后台传数据的编码格式(urlencoded,formdata,json)
                //现在用formdata对象处理了,就不需要指定编码格式了,不要给我编码了
                contentType:false,
                data:formdata,
                success:function (data) {
                    alert(data)
                }
            })

后端
    def plus(request):
    if request.method == 'POST':
        print(request.FILES)
        file_obj = request.FILES.get('myfile')
        with open(file_obj.name,'wb') as f:
            for line in file_obj:
                f.write(line)
        return HttpResponse('ok')
    return render(request,'index.html')
```

​    

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

分页器
    页数通常都取奇数页,为的是符合中国人的审美标准(对称美)
自定义分页器使用
    后端:
        # 固定用法 获取用户想访问的当前页
        page = request.GET.get('page',1)
        # 实例化分页器对象
        page_obj = Pagination(current_page=page,all_count=book_queryset.count())
        # 对总数据对象进行切片
        page_queryset = book_queryset[page_obj.start:page_obj.end]
    前端:
        {{ page_obj.page_html|safe }}
不需要自己写,拷贝过去直接即可,
只需要你知道使用方法即可.内部逻辑感兴趣的可以去研究一下
```

​    
​    
​    
​    
​    
​    

```
django settings配置文件
    由来:为什么我在用django配置的时候导入的不是我项目名下的那个settings
    但是我配置了之后依然能够起作用,这是为什么?
    from django.conf import settings  # 入口
    
    settings = LazySettings()  # 单例
    
    from django.conf import global_settings
    class LazySettings(LazyObject):  
            def _setup(self, name=None):
                settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 获取全局的键值对,在manage.py中启动时就已经设置了一个
                self._wrapped = Settings(settings_module)
    
    class Settings(object):
        def __init__(self, settings_module):
            for setting in dir(global_settings):  # 先获取系统默认配置里面的所有的变量名
                if setting.isupper():
                    setattr(self, setting, getattr(global_settings, setting))  # 给settings对象设置键值对
            self.SETTINGS_MODULE = settings_module
            mod = importlib.import_module(self.SETTINGS_MODULE)
            
            for setting in dir(mod):
                if setting.isupper():
                    setting_value = getattr(mod, setting)
                    setattr(self, setting, setting_value)  # 给settings对象设置键值对
```

猜你喜欢

转载自www.cnblogs.com/tangda/p/10754050.html