创建表的时候字段常见的参数
choices参数的使用
应用场景:
学历:
小学 初中 高中 本科 硕士 博士 1 2 3 4 5 6
客户来源:
微信渠道 广告 介绍 QQ 等等
性别:
男 女 未知
"""对于以上可能被我们列举完的字段我们一般都是选择使用choices参来做"""
class UserInfo(models.Model):
username = models.CharField(max_length=64)
password = models.CharField(max_length=32)
gender_choices = (
(1, '男'),
(2, '女'),
(3, '未知'),
)
"""字段存储的范围还是取决于数据类型的字段"""
gender = models.SmallIntegerField(choices=gender_choices)
res=models.UserInfo.objects.filter(pk=4).first()
print(res.gender)
print(res.get_score_display())
数据传递和格式详解
前端的请求发送到django后都会被封装到HttpRequest对象中,而该对象下有一个非常重要的属性
HttpRequest.body,即请求体
"""
可以发送网络请求的标签
a标签 GET请求
form表单 GET请求 POST请求
ajax技术 GET请求 POST请求
ajax默认的数据格式为urlencoded
该格式数据:i1=123213&i2=12313
针对该类型的数据:django会自动处理到request.POST中
ajax 传递json格式的数据的时候,在后端需要用request.body接收"""
form表单默认的数据格式也是urlencoded
该格式数据:i1=123213&i2=12313
针对该类型的数据:django会自动处理到request.POST中
form表单还可以发送数据格式为formdata
针对该类型的数据:普通的数据还是解析到request.POST中 文件类型的数据解析到request.FILES中
当浏览器基于http协议的GET方法提交数据时,没有请求体一说,
数据会按照k1=v1&k2=v2&k3=v3的格式放到url中,
然后发送给django,django会将这些数据封装到request.GET中,
注意此时的请求体request.body为空、无用
当浏览器基于http协议的POST方法提交数据时,数据会放在请求体内,然后发送给django
django会将接收到的请求体数据存放于HttpRequest.body属性中.
但该属性的值为Bytes类型(套接字数据传输都是bytes类型),
而通常情况下直接处理Bytes、并从中提取有用数据的操作是复杂而繁琐的,
好在django会对它做进一步的处理与封装以便我们更为方便地提取数据,
具体如何处理呢?
当前端采用POST提交数据时,form表单可以通过属性enctype进行设置编码格,如下
编码格式1(默认的编码格式):enctype="application/x-www-form-urlencoded"
编码格式2(使用form表单上传文件时只能用该编码):enctype="multipart/form-data"
数据有三种常用编码格式,编码格式不同Django会有不同的处理方式
HttpRequest.body中的数据格式为b'a=1&b=2&c=3'
django会将其提取出来封装到request.POST中
request.FILES此时为空
如:
print(request.body)
print(request.POST)
print(request.FILES)
HttpRequest.body中的数据格式为b'------WebKitFormBoundaryKtcwuksQltpNprep\r\nContent-Disposition: form-data;......',注意,文件部分数据是流数据,所以不在浏览器中显示是正常的
django会将request.body中的非文件数据部分提取出来封装到request.POST中
将上传的文件部分数据专门提取出来封装到request.FILES属性中
如:
print(request.body)
print(request.POST)
print(request.FILES)
强调:
1、毫无疑问,编码格式2的数据量要大于编码格式1,如果无需上传文件,还是推荐使用更为精简的编码格式1
2、FILES will only contain data if the request method was POST and the <form> that posted to the request had enctype="multipart/form-data". Otherwise, FILES will be a blank dictionary-like object.
"此时在django后台,request.POST和request.FILES中是没有值的,都放到request.body中了,需要用json.loads对其进行反序列化"
如:
print(request.body)
print(request.POST)
print(request.FILES)
前端往后台POST提交数据,常用技术有form表单和ajax两种
form表单可以设置的数据编码格式有:编码格式1、编码格式2
ajax可以设置的数据编码格式有:编码格式1、编码格式2、编码格式3
ajax语法
python中序列化反序列化
import json
json.dumps()
json.loads()
Js中序列化反序列化
JSON.stringify()
JSON.parse()
无感传输,该技术主要用来向后端发送数据
AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新
1. 异步提交
2. 局部刷新
ajax默认的数据格式为urlencoded,还可以是json
$.ajax({
url:'',
type:'post', // 不写该参数 默认是get请求
data:JSON.stringify({'username':'jason','pwd':123}),
contentType:'application/json'
success:function (args) {
alert(args)
}
})
如果设置了'dataType':
"""前后端交互 如果采用的是ajax 那么后端的返回值应该使用字典(json格式,所以要用jsonresponse 和Httpresponse 两种方式返回数据)"""
当后端采用HttpResponse返回json格式数据到ajax异步回调函数默认情况下需要我们自己做反序列化JSON.parse如果不想自己处理可以添加dataType:"JSON"
如果后端是采用JsonResponse返回json格式数据则无需我们自己处理也不需要添加
dataType:"JSON"参数(加了也不影响)
'contentType':json 告诉后端,前端传输的是json格式的数据,那么,在前端发送的时候就需要序列化在发送,后端接收的数据就需要在request.body里接收
当'processData': true的时候,jquery会序列化数据。当processData: false的时候,jquery不会对数据进行处理,默认是true,所以在上传文件的时候,要设置为flase,不对数据格式做任何处理
ajax发送文件
$('#b1').click(function () {
// ajax发送携带文件数据的请求 需要借助于内置对象FormData
// 1.先生成一个FormData对象
let formDataObj = new FormData();
// 2.往该对象中添加数据(支持普通数据和文件数据)
formDataObj.append('name',$('#i2').val());
formDataObj.append('pwd',$('#i3').val());
//" 获取文件数据 有固定的语法格式"
formDataObj.append('file',$('#i1')[0].files[0]);
// 发送ajax请求
$.ajax({
url:"/ab_file/",
type:'post',
// 发送文件需要额外配置的两个参数
" contentType:false, 表示前端对数据格式不做任何处理
"processData: false,"" 告诉jequery,对数据格式不做任何处理
data:formDataObj,
success:function (res) {
针对res的一系列操作,这个res代表后端返回的全部结果,叫啥都无所谓,只要和function里面的参数一样就可以
}
})
})
序列化模块
所谓序列化模块就是将列表套字典形式的数据一次性转成json数据格式
from django.core import serializers
def ab_ser(request):
data = models.Books.objects.all()
ret = serializers.serialize('json', data)
return HttpResponse(ret)