今日学习目标

  • 学习Ajax具体操作

文章目录

  • 今日学习目标
  • 学习内容
  • 一、choices字段
  • 二、AjaX
    • contentType前后端传输数据编码格式
    • ajax传json格式数据
    • ajax传文件

学习内容

  • choices字段
  • ajax简介

一、choices字段

主要运用在用一些特殊字符或数字代表繁琐的字符串,一来为了节省数据空间,二来为了数据的可读性。可以用于输入用户性别,用户学历,工作状态等。

eg:创建一个用户信息表,其中的性别字段,就可以用到choices字段,用数字来代替对应的性别字符。

from django.db import models
class Userinfo(models.Model):username = models.CharField(max_length=64)# choices字段,用元组形式choices = ((1, 'male'),(2, 'female'),)gender = models.IntegerField(choices=choices)  # 这一句很重要,choices一定要等于定义的那个变量名

要注意的是如果我们在表中存的是上面的元组中的数字,它就会显示,但是数字没有对应关系也是可以存到表中的,但是在点get_gender_display语法获取数字对应的中文时不会取到,而会取到该数字,因此没有对应关系的话,存这个数字也就没有意义。

针对choices字段,如果你想要获取数字所对应的中文,不能直接点字段,

固定句式:数据对象.get_字段名_display(),当没有对应关系的时候,该句式获取到的还是数字

eg:

from app01 import models
user_obj = models.Userinfo.objects.filter(pk=4).first()
print(user_obj.username)
print(user_obj.gender)   # 这样的结果只是数字
print(user_obj.get_gender_display())   # 有对应关系的时候,该句式就能获取到数字对应的中文

对于上述的用户信息表,我们可以用choices字段再给它创建上课记录和本节成绩的字段

# 创建上课记录字段,用特殊的字符来代表繁琐的字符串
record_choices = (('checked', "已签到"),('vacate', "请假"),('late', "迟到"),('noshow', "缺勤"),('leave_early', "早退"),)
record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=255)

二、AjaX

AjaX是一门js的 技术,基于原生js开发的,但是用原生的js写代码过于繁琐

AjaX最大的优点是在不重新加载整个页面的情况下, 可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

特点:

  • 异步提交

    同步异步:描述的任务的提交方式
    同步:提交任务之后,原地等待任务的返回结果,期间不干任何事
    异步:提交任务之后,不原地等待,直接执行下一行代码,任务的返回通过回调机制
    阻塞非阻塞:程序的运行状态

  • 局部刷新

    一个页面不是整体刷新,而是页面的某个地方局部刷新

举个例子:展示一个前端页面,页面上有三个输入框,前两个框输入数字,点击按钮朝后端发请求,页面不刷新的情况下,完成数字的加法运算

ajax_test.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<input type="text" id="t1">+<input type="text" id="t2">=<input type="text" id="t3">
<p><button id="b1">提交计算</button>
</p>
<script>
$('#b1').on('click',function () {// 朝后端提交post数据$.ajax({// 1.到底朝后端哪个地址发送数据url:'',  // 专门用来控制朝后端提交数据的地址,不写默认朝当前地址提交// 2.指定到底发送什么请求type:'post',  // 专门制定ajax发送的请求方式// 3.发送的数据是什么data:{'t1': $('#t1').val(), 't2': $('#t2').val()},// 4.异步提交的任务,需要通过回调函数来处理success:function (data) {  // data形参指代的就是异步提交的返回结果// 通过DOM操作将内容渲染到标签内容上$('#t3').val(data)}})
})
</script>
</body>
</html>

views.py

from django.shortcuts import render, HttpResponse
def ajax_test(request):print(request.is_ajax())  # 判断当前请求是否是ajax请求if request.is_ajax():if request.method == 'POST':t1 = request.POST.get('t1')t2 = request.POST.get('t2')res = int(t1)+int(t2)return HttpResponse(res)return render(request, 'ajax_test.html')

urls.py

from django.contrib import admin
from django.conf.urls import url
from homework1018 import views
urlpatterns = [url('admin/', admin.site.urls),url('^ajax_test/', views.ajax_test),
]

contentType前后端传输数据编码格式

  • form表单默认发送的编码格式
    Content-Type: application/x-www-form-urlencoded
    数据格式:username=jason&password=123
    django后端会自动处理到:request.POST

  • form表单发送文件
    Content-Type: multipart/form-data
    数据格式:隐藏不让看
    django后端会自动处理:request.POST request.FILES

  • ajax默认的编码格式
    Content-Type: application/x-www-form-urlencoded
    数据格式:username=jason&password=123
    django后端会自动处理到:request.POST

总结:django后端针对不同的编码格式数据,会有不同的处理机制以及不同的获取该数据的方法。

ajax传json格式数据

前后端在做数据交互的时候 一定一定要表明你所发的的数据到底是什么格式。
前后端交互时你不能骗人家,你的数据是什么格式 你就应该准确无误告诉别人是什么格式 。

还是以上述例子为例,发送json格式数据

注意

  1. 指定contentType参数
    contentType:‘application/json’,
  2. 要将你发送的数据 确保是json格式的
    data:JSON.stringify({‘username’:‘jason’,‘password’:‘123’})

前端页面

<p><button id="b1">计算</button>
</p>
<script>
$('#b1').on('click',function () {// 朝后端提交post数据$.ajax({// 1.到底朝后端哪个地址发送数据url:'',  // 专门用来控制朝后端提交数据的地址,不写默认朝当前地址提交// 2.指定到底发送什么请求type:'post',  // 专门制定ajax发送的请求方式// 3.告诉后端你当前的数据格式到底是什么类型contentType:'application/json',  // 告诉后端当前数据格式是json类型// 4.发送的数据是什么data:JSON.stringify({'username':'jason','password':'123'}),// 5.异步提交的任务,需要通过回调函数来处理success:function (data) {  // data形参指代的就是异步提交的返回结果// 通过DOM操作将内容渲染到标签内容上alert(data)}})
})
</script>

后端获取数据

django后端针对json格式的数据 不会自动帮你解析 会直接原封不动的给你放到request.body中
你可以手动处理 获取数据,格式:

json_bytes = request.body
json_str = str(json_bytes,encoding='utf-8')
json_dict = json.loads(json_str)
from django.shortcuts import render, HttpResponse, redirect
import json
def ajax_test(request):if request.method == 'POST':# django后端针对json格式的数据不会自动帮你解析,会直接原封不动的给你放到request.body中# 你可以手动处理,获取数据# print(request.body)  # b'{"username":"jason","password":"123"}'json_bytes = request.bodyjson_str = str(json_bytes, encoding='utf-8')  # 将bytes格式转化为json格式字符串json_dict = json.loads(json_str)   # 将json格式字符串反序列化出来print(json_dict, type(json_dict))return render(request, 'ajax_test.html')

ajax传文件

ajax传文件需要注意的事项

  1. 利用formdata对象 能够简单的快速传输数据 (普通键值 + 文件)

    生成一个formdata对象: var myFormData = new FormData()

  2. 有几个参数
    data:formdata对象
    contentType:false # 不用任何编码 因为formdata对象自带编码 django能够识别该对象
    processData:false # 告诉浏览器不要处理我的数据 直接发就行

  3. 需要利用内置对象:FormData
    该对象既可以传普通的键值 也可以传文件

  4. 获取input框用户上传的文件的内容
    1.先通过jquery查找到该标签
    2.将jquery对象转换成原生的js对象
    3.利用原生js对象的方法 直接获取文件内容
    eg: $(‘#t3’)[0].files[0]

前端页面upload.html

<body>
<input type="text" name="username" id="t1">
<input type="text" name="password" id="t2">
<input type="file" name="myfile" id="t3">
<button id="b1">提交</button>
<script>$('#b1').click(function () {// 1.先生成一个formdata对象var myFormData = new FormData();// 2.朝对象中添加普通的键值myFormData.append('username',$("#t1").val());myFormData.append('password',$("#t2").val());// 3.朝对象中添加文件数据// 1.先通过jquery查找到该标签// 2.将jquery对象转换成原生的js对象// 3.利用原生js对象的方法 直接获取文件内容myFormData.append('myfile',$('#t3')[0].files[0]);$.ajax({url:'',type:'post',data:myFormData,  // 直接丢对象// ajax传文件 一定要指定两个关键性的参数contentType:false,  // 不用任何编码 因为formdata对象自带编码 django能够识别该对象processData:false,  // 告诉浏览器不要处理我的数据 直接发就行success:function (data) {alert(data)}})})
</script>
</body>

后端

def upload(request):if request.is_ajax():if request.method == 'POST':print(request.POST)print(request.FILES)return HttpResponse('收到啦 dsb')render(request, 'upload.html')

Python攻城师的成长——ORM(choices字段)、AJAX相关推荐

  1. Python攻城师的成长————ORM查询

    今日学习目标 熟悉掌握ORM语法操作 文章目录 今日学习目标 学习内容 一.神奇的双下划线查询 二.orm创建外键关系 三.外键字段的增删改查 四.正反向的概念 五.ORM多表查询 正向查询 反向查询 ...

  2. Python攻城师的成长————网络编程(socket套接字、通信循环、链接循环、黏包问题)

    今日学习目标 学习什么是socket套接字,并依靠它去处理TCP协议等网络编程问题 文章目录 今日学习目标 学习内容 一. socket套接字 1.什么是socket 2.套接字发展史及分类 3.套接 ...

  3. Python攻城师的成长————模块突破(collections、time与datetime、random随机数模块)

    今日学习目标: 学习并应用collections.time与datetime.random随机数模块知识 今日学习内容: collections模块 time与datetime模块 random随机数 ...

  4. Python攻城师的成长————面向对象的三大特征(继承、多态)

    学习目标: 了解继承与多态的概念,重点是要学会运用继承去处理问题 学习内容: 继承 在面对对象程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类,而被继 ...

  5. Python攻城师的成长————MySQL数据库关键字

    今日学习目标 熟悉关键字用法,掌握多表查询思路 文章目录 今日学习目标 学习内容 一.查询关键字 查询关键字之having过滤 查询关键字之distinct去重 查询关键字之order by排序 查询 ...

  6. Python攻城师的成长————css语法、伪元素选择器(部分)

    今日学习目标 熟悉并掌握css中各种修改属性的方法. 文章目录 今日学习目标 学习内容 一.伪元素选择器 css操作文本内容 选择器优先级 二.css修改属性 css修改文字属性 css修改字体属性 ...

  7. Python攻城师的成长————Django框架(csrf相关装饰器、基于中间件思想编写项目、auth认证模块)

    今日学习目标 逐步掌握csrf相关装饰器.基于中间件思想编写项目.auth认证模块知识点 文章目录 今日学习目标 学习内容 一. csrf相关装饰器 二.基于中间件思想编写项目 三.auth认证模块 ...

  8. Python攻城师————前端学习(jQuery框架、第三方框架bootstrap框架)

    今日学习目标 继续学习jQuery框架剩余的内容. 文章目录 今日学习目标 学习内容 一.jQuery操作标签 class操作 样式操作 位置操作 文本值操作 属性操作 文档处理操作 二.jQuery ...

  9. Python攻城师————MySQL数据库(自增、外键、关键字)

    今日学习目标 正式学习MySQL数据库语句. 文章目录 今日学习目标 学习内容 一.自增特性 二.约束条件之外键 外键的定义 外键约束创建 三.查询关键字 查询关键字之select与from 查询关键 ...

  10. 如何成为一名优秀的web前端工程师(前端攻城师)

    程序设计之道无远弗届,御晨风而返.---- 杰佛瑞 · 詹姆士 我所遇到的前端程序员分两种: 第一种一直在问:如何学习前端? 第二种总说:前端很简单,就那么一点东西. 我从没有听到有人问:如何做一名优 ...

最新文章

  1. oracle vm virtualbox安装centos并配置Java环境
  2. python小程序-python学习—几个简单小程序
  3. Python带参数复数表示
  4. ios调用restful接口_Postman调用https异常解决
  5. 【Android】资源加载过程
  6. JS 获取浏览器窗口大小
  7. MySQL日期、字符串、数值型转换
  8. RTSP协议播放网络视频
  9. 赛门铁克调研发现越来越多的物联网设备被用于实施DDoS攻击
  10. Android 内存监测工具 DDMS -- Heap
  11. python之函数用法basestring
  12. win10 物理按键映射、快捷键修改
  13. 用优启通制作U盘启动盘教程(UEFI版)
  14. paper report: DIRT-T
  15. 在VMware ESXi中使用固态硬盘
  16. 法国计算机高等工程师学院排名,法国人工智能专业大学排名(2020年USNEWS)_快飞留学...
  17. JS和Android互调(调用相机拍照)
  18. 网易云课程:深度学习与PyTorch入门实战
  19. 蓝桥杯真题 13省Cc1-猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。于
  20. 多角度解析特斯拉电动车技术到底领先了多少?|厚势

热门文章

  1. html如何制作圣诞树,分享用HTML5来实现一个3D逼真的圣诞树
  2. 破窑赋--11.11在一个小吃店看到
  3. 中国水产科学研究院教授黄樟翰走进伊宅购集团考察伊家田园项目
  4. vue聊天功能模块(五)pre标签使得消息表情换行
  5. 应用数理统计之概率论复习与补充
  6. php 编写桌面程序_PHP能开发桌面应用吗?
  7. 使用VM Ware创建虚拟机
  8. 【软件分析/静态程序分析学习笔记】3.数据流分析(Data Flow Analysis) (上):可达性分析(Reaching Definitions)
  9. 状告技术总监,索赔 90 万元,称其拖延研发进度、系统频繁崩溃出错、产品质量存在严重问题...
  10. TIPTOP ERP 开发视频教程