• ajax相关操作


     1 inclusion_tag

       -干什么用的?生成html的片段(动态,传参数,传数据)

       -app下新建一个模块,templatetags

       -创建一个py文件(mytag.py)

       -from django.template import Library

       -register=Library() ----->register名字一定不能变

       -写装饰器(标签,过滤器,inclusion_tag)

       -@inclusion_tag('模板路径',name='重命名')

       -def my_in(): 不写,写多个,不写不传,写多个,按空格来传参

          - 一堆逻辑处理,查数据库

       - ret=Book.object.all()

           return {''books':ret}

       -在模板中:

         可以用books这个变量,渲染页面

       -应用: -在另一个模板中:

       -{%load mytag.py%}

       -{% my_in %}

      2 defer,only

       -defer---->除了指定字段之外

      -only---->只查询几个字段

       -比如:ret=Book.object.all().only('name')

       -id始终会查

       -结果是queryset对象,套book对象

       -问:如果取price,发生了什么?

       -它会再次查询数据库,对数据库造成压力

    3 事务(原子性操作)

       from django.db import transition

      with transition.atomic():

         sql1

         sql2

    4 choice

       -模型表中某个字段,可以指定choice,用在选择不经常变的情况,经常变,尽量用数据库                                              user_type=models.ForeignKey(to='Info', to_field='id',db_constraint=False)

          #取出对应的汉字

         # author对象.user_type.name

             mychoice=((1,'男'),(2,'女'),(3,'其他'))

             # dd = models.ForeignKey(to='Info', to_field='id')

            #取出对应的汉字

       dd = models.ForeignKey(choices=mychoice)

    5反向解析

    -动态获取路径(根据名字)
                -路由:    url(r'^inde/$', views.Test.as_view(),name='index'),
                          url(r'^inde/(d+)$', views.Test.as_view(),name='index'),
                -在视图层:
                def mytest(request):
                    # 用在视图层
                    url=reverse('index',args=(12,))
                    return redirect(url)
                -在模板中用:
                    <a href="/index/">点我跳到index页面</a>
                    <a href="{% url 'index' 12 %}">点我跳到index页面</a>
                    {#这个位置相当于放了"/inde/"#}
    6 多对多的关系,三种写法
    -手动创建第三张表(不创建关联关系)
                class Book(models.Model):
                    # 默认会创建id
                    name = models.CharField(max_length=32)
                class Author(models.Model):
                    name = models.CharField(max_length=32)
                class Book2Author(models.Model):
                    id = models.AutoField(primary_key=True)
                    book=models.ForeignKey(to='Book',to_field='id')
                    author=models.ForeignKey(to='Author',to_field='id')
                -不管是插入和查询,删除,都很麻烦(一般不用)
            -自动创建第三张表
                -查询,插入,删除,都很方便
                -缺点:字段是固定的,第三张表如果要添加字段,实现不了
            -手动创建第三张表,建立关联关系
                class Book(models.Model):
                    # 默认会创建id
                    name = models.CharField(max_length=32)
                    # 中介模型,手动指定第三张中间表是Book2Author
                    authors=models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author'))
                class Author(models.Model):
                    name = models.CharField(max_length=32)
                    def __str__(self):
                        return self.name
                class Book2Author(models.Model):
                    id = models.AutoField(primary_key=True)
                    book=models.ForeignKey(to='Book',to_field='id')
                    author=models.ForeignKey(to='Author',to_field='id')
                    
                -through:来指定我的第三张表是哪个
                -through_fields:('book','author'),第一个值是:从中间表找到设置关联字段的表,通过哪个字段,第一个位置就写它
                -终极总结:防止混了:关联字段就是表名小写,第一个值:就是当前表的表名小写
                -查询,新增,删除,都很方便
                -第三张表,可以添加别的字段


    7、ajax

    1 什么是ajax:异步的JavaScript和xml,跟后台交互,都用json
            2 ajax干啥用的?前后端做数据交互:
            3 之前学的跟后台做交互的方式:
                -第一种:在浏览器窗口输入地址(get)
                -第二种:用form表单提交数据
            4 特点:
                -异步(异步和同步的区别:同步是请求发过去,要等着回应;异步:不需要等回应,可以进行其他操作)
                -局部刷新:
            5 $.ajax({
                url:'/index/',
                type:'post',
                //data:往后台提交的数据
                data:{'name':'lqz','age':18},
                //成功的时候回调这个函数
                success:function (data) {
                    alert(data)
                }
            })
            6 上传文件
                模板层:
                $("#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:'/files_ajax/',
                        type:'post',
                        //不预处理数据,(name=lqz&age=18)
                        processData:false,
                        //指定往后台传数据的编码格式(urlencoded,formdata,json)
                        //现在用formdata对象处理了,就不需要指定编码格式了,不要给我编码了
                        contentType:false,
                        data:formdata,
                        success:function (data) {
                            alert(data)
    
                        }
                    })
    
                视图层:(跟form表单上传文件完全一样)
                def files_ajax(request):
                    # 提交文件从,request.FILES中取,提交的数据,从request.POST中取
                    name=request.POST.get('name')
                    print(name)
                    dic_files = request.FILES
                    myfile = dic_files.get('myfile')
                    with open(myfile.name, 'wb') as f:
                        # 循环上传过来的文件
                        for line in myfile:
                            # 往空文件中写
                            f.write(line)
                    return HttpResponse('ok')
                
            7 基于ajax提交json格式数据
                -模板层:
                 $('#btn').click(function () {
                    var post_data={'name':$("#name").val(),'pwd':$("#pwd").val()};
                    console.log(typeof post_data);
                    // 如何把post_data这个字典,转成json格式字符串
                    //JSON.stringify相当于python中json.dumpus(post_data)
                    //pos是个字符串,json格式字符串
                    var pos=JSON.stringify(post_data);
                    console.log(typeof pos);
                    $.ajax({
                        url:'/json/',
                        type:'post',
                        data:pos,
                        contentType:'application/json',
                        success:function (data) {
                            //如果data是json格式字符串,如何转成对象(字典)?
                            //data=JSON.parse(data)
                            console.log(typeof data)
                            console.log(data)
                            var ret=JSON.parse(data)
                            console.log(typeof ret)
                            console.log(ret.status)
                            //alert(data)
    
                        }
                    })
                })
                -视图层:
                    def add_json(request):
                        if request.method=='GET':
                            return render(request,'json.html')
                        print(request.POST)
                        print(request.GET)
                        print(request.body)
                        import json
                        # res是个字典
                        res=json.loads(request.body.decode('utf-8'))
                        print(res)
                        print(type(res))
                        dic={'status':'100','msg':'登录成功'}
                        # return HttpResponse('ok')
                        # 返回给前台json格式
                        return HttpResponse(json.dumps(dic))
                        # return JsonResponse(dic)
                            
                -重点:*****
                    - 请求的编码方式:
                        contentType:'application/json',
                    -响应回来解析的方式
                        dataType:'json',
  • 相关阅读:
    javaweb基础----省市县三级联动(javascript版)
    javaweb开发出错排查思路
    javaweb基础----使用原生fileupload上传文件时找不到上传的文件位置
    javaweb基础----Tomcat启动失败(Tomcat9)
    javaweb基础----Tomcat端口被占用
    命令行显示
    java开发环境
    java se ee me 区别
    解决win10 2503 2502 权限等问题
    浏览器只有ie可以登录
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/9985322.html
Copyright © 2020-2023  润新知