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以后可以

 

posted @ 2021-06-17 15:21  DEJAVU_ERIC  阅读(98)  评论(0编辑  收藏  举报