zoukankan      html  css  js  c++  java
  • DAY 53 django08

    1 图书管理系统编辑功能
    2 常用和非常用字段
    3 字段参数
    4 字段关系:to ,to_fileds,related_name,related_query_name,on_delete ,db_constraint

    5 第三张表建立的三种方式
    -纯手动建立(不使用manytomany)
       -自动创建第三张表
       -手动创建第三张表,使用manytomany(多对多api用不了了)
    6 Meta元信息

    7 原生sql

    8 orm框架(了解)
    -python:django的orm,sqlalchemy(独立使用,集成到flask)
       -go:beego自带的orm框架,gorm
       -java:mybatis,Hibernate

    9 ajax:js跟后端交互
    -异步
       -局部刷新
       -原生js写(麻烦,兼容浏览器)
       -jq的ajax
       -axios

    1 ajax发送其他请求

    1 大坑
    -如果在form表单中,写button和input是submit类型,会触发form表单的提交
       -如果不想触发:
      -不写在form表单中
           -使用input,类型是button
           
    2
    -后端响应格式如果是:html/text格式,ajax接收到数据后需要自己转成对象
       -后端响应格式是:json,ajax接收到数据后会自动转成对象
       -总结:后端返回数据,统一都用JsonResponse、
       
    3
    -如果使用了ajax,后端就不要返回rediret,render,HttpResponse
       -直接返回JsonResponse

    1.1 登录功能前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>Title</title>
       <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <body>


       <p> 用户名:<input type="text" id="id_name"></p>
       <p> 密码:<input type="password" id="id_password"></p>
       <button id="id_btn">提交</button> <span class="error" style="color: red"></span>



    </body>
    <script>

       $('#id_btn').click(function () {
           $.ajax({
               url: '/login/',
               method: 'post',
               data: {username: $('#id_name').val(), password: $('#id_password').val()},
               success: function (data) {
                   //res=JSON.parse(data)
                   //console.log(data)
                   //console.log(res)
                   // data 现在是对象类型

                   if(data.status==100){
                       //登录成功,重定向到百度,前端重定向
                       location.href='http://www.baidu.com'
                       //location.href='/index/'

                  }else {
                       //登录失败
                       //$('.error').html(data.msg).css({'color':'red'})
                       $('.error').html(data.msg)
                  }
              },
               error: function (data) {
                   console.log(data)
              }
          })

      })



    </script>

    </html>

    1.2 登录功能后端

    from django.shortcuts import render,redirect,HttpResponse
    from django.http import JsonResponse

    # Create your views here.

    from app01 import models
    import json
    def login(request):
       if request.method=='GET':
           return render(request,'login.html')
       # elif request.method=='POST':
       elif request.is_ajax():
           response={'status':100,'msg':None}
           name=request.POST.get('username')
           password=request.POST.get('password')
           user=models.User.objects.filter(name=name,password=password).first()
           if user:
               # 用户名和密码都对了
               # return redirect('') 出错
               response['msg']="登录成功"

           else:
               response['status']=101
               response['msg'] = "用户名或密码错误"
           # return HttpResponse(json.dumps(response))
           return  JsonResponse(response)
           # return redirect('http://www.baidu.com')
           # return render(request,'login.html')

    1.3 登录功能路由

    url(r'^login/', views.login),

    1.4 登录功能模型类

    from django.db import models

    # Create your models here.

    class User(models.Model):
       name=models.CharField(max_length=32)
       password=models.CharField(max_length=32)

     

    2 上传文件(ajax和form两种方式)

    1 http --post--请求,有编码格式,主流有三种
    -urlencoded :默认的----》从request.POST取提交的数据
       -form-data :上传文件的----》从request.POST取提交的数据,request.FILES中取文件
       -json      :ajax发送json格式数据-----》request.POST取不出数据了
       
    2 使用ajax和form表单,默认都是urlencoded格式
    3 如果上传文件:form表单指定格式,ajax要使用Formdata对象

    4 如果编码方式是urlencoded格式,放到body体中数据格式如下
    username=lqz&password=123
       
    5 如果是formdata编码格式,body体中是:两部分,数据和文件

    6 如果是json格式,body体中的格式是:就是json格式字符串
    -注意:注意:注意:如果这种格式,request.POST取不到值了

    2.1 form表单上传文件

    <h1>form表单上传文件</h1>
    <form action="" method="post" enctype="multipart/form-data">
       <p>用户名:<input type="text" name="name"></p>
       <p>文件:<input type="file" name="myfile"></p>
       <input type="submit" value="提交">

    </form>

    2.2 ajax 上传文件

    <h1>ajax上传文件</h1>
    <p>用户名:<input type="text" id="id_name"></p>
    <p>文件:<input type="file" id="id_myfile"></p>
    <button id="id_btn">提交</button>


    <script>

    $('#id_btn').click(function () {
    //如果要上传文件,需要借助于一个js的FormData对象

    var formdata = new FormData() //实例化得到一个FormData对象
    formdata.append('name', $('#id_name').val()) //追加了一个name对应填入的值
    //能追加文件
    var file = $('#id_myfile')[0].files[0]
    formdata.append('myfile', file)
    $.ajax({
    url: 'file_upload',
    method: 'post',
    //上传文件,一定要注意如下两行
    processData: false, //不预处理数据,
    contentType: false, //不指定编码格式,使用formdata对象的默认编码就是formdata格式
    data: formdata,
    success: function (data) {
    console.log(data)

    }
    })

    })
    </script>

    2.3 后端

    def file_upload(request):
    if request.method=='GET':
    return render(request,'file_upload.html')
    else:
    name=request.POST.get('name')
    myfile=request.FILES.get('myfile')
    print(type(myfile)) # 查看类型
    from django.core.files.uploadedfile import InMemoryUploadedFile
    with open(myfile.name,'wb') as f:
    for line in myfile:
    f.write(line)

    return HttpResponse('上传成功')

    2.4 路由

    url(r'^file_upload/', views.file_upload),

    3 ajax上传json格式

    3.1 前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <body>

    <h1>ajax提交json格式</h1>


    <p>用户名: <input type="text" id="id_name"></p>
    <p>密码: <input type="password" id="id_password"></p>
    <button id="id_button">提交</button>
    </body>

    <script>

    $('#id_button').click(function () {

    $.ajax({
    url: '/ajax_json/',
    method: 'post',
    contentType: 'application/json', //指定编码格式
    data: JSON.stringify({name:$('#id_name').val(),password:$('#id_password').val()}), //json格式字符串
    success: function (data) {
    console.log(data)

    }
    })

    })
    </script>
    </html>

    3.2 后端

    def ajax_json(request):
    if request.method=='GET':
    return render(request,'ajax_json.html')

    else:
    # json格式,从POST中取不出来

    name=request.POST.get('name')
    print(type(request.POST))
    # from django.http.request import QueryDict
    print(name)
    # 在body体中,b格式

    request.data=json.loads(request.body)

    name=request.data.get('name')
    password=request.data.get('password')
    print(name)
    print(password)
    return HttpResponse('ok')

     

    4 django内置序列化(了解)

    把对象转成json格式字符串,django内置的不好用,字段不能控制

    目前阶段,要做序列化,for循环拼列表套字典

    4.1 后端

    def test(request):
    user_list = models.User.objects.all()
    ret = serializers.serialize("json", user_list)

    return HttpResponse(ret)

    4.2 路由

    url(r'^test/', views.test),

    5 分页器的使用

    ##############分页器
    ###批量插入数据

    # def books_page(request):
    # # 第一种方案,每循环依次,操作一下数据库,性能低
    # # for i in range(1000):
    # # book=models.Books.objects.create(name='图书%s'%i,price=i+10,publish='东京出版社')
    # #
    # # 第二种方案,批量插入
    # book_list=[]
    # for i in range(1000):
    # book=models.Books(name='图书%s'%i,price=i+10,publish='东京出版社')
    # book_list.append(book)
    #
    # models.Books.objects.bulk_create(book_list,batch_size=100)
    #
    #
    # return HttpResponse('ok')


    from django.core.paginator import Paginator
    def books_page(request):
    book_list=models.Books.objects.all()
    paginator=Paginator(book_list,10)
    # Paginator对象的属性
    print(paginator.count) # 数据总条数
    print(paginator.num_pages) # 总页数
    print(paginator.per_page) # 每页显示条数
    print(paginator.page_range) # range(1, 101)
    print(paginator.page(1))
    # Page对象的属性和方法
    # has_next 是否有下一页
    # next_page_number 下一页页码
    # has_previous 是否有上一页
    # previous_page_number 上一页页码
    # object_list 分页之后的数据列表
    # number 当前页
    page=paginator.page(2)
    print(page.has_next())
    print(page.next_page_number())
    print(page.has_previous())
    print(page.previous_page_number())
    print(page.object_list)
    print(page.number)

    return render(request,'book_page.html',locals())

    补充

    json.loads(b'dfdasfda')
    问题:json可以直接loads    bytes格式吗?
    -3.5之前不可以
       -3.6以后可以

     

  • 相关阅读:
    详解git pull和git fetch的区别
    什么是移臂调度,什么是旋转调度?
    常用的资源分配策略有哪两种?在每一种策略中,资源请求队列的排序原则是什么?
    什么是虚拟资源,对主存储器而言,用户使用的虚拟资源是什么?
    进程调度的任务是什么,线程调度的任务是什么?
    用于进程控制的原语主要由哪几个,每个原语的执行将使进程的状态发生什么变化?
    试说明进程创建的主要功能是什么?
    什么是线程,线程与进程有什么区别?
    什么是进程互斥,什么是进程同步,同步和互斥这两个概念有什么联系和区别?
    n个并发进程共用一个公共变量Q,写出用信号灯实现n个进程互斥的程序描述,给出信号灯值得取值范围,并说明每个取值范围的物理意义。
  • 原文地址:https://www.cnblogs.com/DEJAVU888/p/14893602.html
Copyright © 2011-2022 走看看