django之choice、ajax初步
django之choice参数,ajax
choice参数
应用场景:主要是用户性别、用户工作状态、成绩对应
##在测试文件中运行,需要写以下几个模块
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day62.settings")
import django
django.setup()
choices = (
(1, 'male'),
(2, 'female'),
(3, 'others')
)
gender = models.IntegerField(choices=choices)
##注意:
"""
针对choices字段,如果想拿到数字所对应的的中文或者其他值 不能直接点字段
固定句式 数据对象.get_字段名_display()
"""
执行下面两种语句
from app01 import models
#1.
user_obj = models.Userinfo.objects.filter(pk=2).first()
print(user_obj.username)
print(user_obj.gender)
print(user_obj.get_gender_display())
'''
#会打印出来
nick
1
male
#这样存在值的话,就会把元组中数字对应的信息(比如这里的 male 打印出来)
'''
#2.
user_obj = models.Userinfo.objects.filter(pk=4).first()
print(user_obj.username)
print(user_obj.gender)
print(user_obj.get_gender_display())
'''
#会打印出来
michael
4
4
#这样不存在值的话,即没有对应关系,就会把数字打印出来
'''
#此外,还有以下几个常用的应用场景
#A
record_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
)
record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length = 32)
#B
score_choices = ((100, 'A+'),
(90, 'A'),
(85, 'B+'),
(80, 'B'),
(70, 'B-'),
(60, 'C+'),
(50, 'C'),
(40, 'C-'),
(0, ' D'),
(-1, 'N/A'),
(-100, 'COPY'),
(-1000, 'FAIL'),
)
score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
Ajax
1. 异步提交和局部刷新
异步提交就是说,提交任务之后,不会原地等待,直接执行下一行代码,任务的返回通过回调机制
局部刷新,一个页面不是整体刷新,而是页面的某个地方局部刷新,比如,注册账号时,输入字母,就会判断当前账号是否被注册,但是页面却没有被刷新
2.Ajax 几个小需求(计算器,传json格式,传文件)
"""
Ajax是一门js的技术 基于原生js开发的,但是用原生的js写代码过于繁琐,需要用jq实现ajax的使用
Ajax 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
"""
## 需求一:
'''
1.展示一个前端页面 页面上有三个输入框 前两个框输入数字 点击按钮朝后端发请求页面不刷新的情况下 完成数字的加法运算
'''
#这种情况下的Content-Type: application/x-www-form-urlencoded;就是普通的POST请求内容类型
#form data(表单数据):username=jason&password=123
#前端页面
<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)
alert(data)
}
})
})
</script>
#后端页面
def index(request):
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, 'index.html')
##需求二:json格式
'''
django后端针对json格式的数据 不会自动帮你解析 会直接原封不动的给你放到request.body中
可以手动处理 获取数据
'''
#这种情况下的Content-Type: application/json,告诉后端是json格式的数据类型
#form data 表单数据:json字符串{"username":"jason","password":"123"}
#前端
<p>
<button id="b1">计算</button>
</p>
<script>
$("#bt").on('click', function(){
$.ajax({
url: '',
type: 'post',
contentType: 'application/json',
data: JSON.stringify({
'username': 'jason',
'password': '123'
})
success: function(data){
$('#t3').val(data)
}
})
})
</script>
#后端
import json
def index(request):
if request.is_ajax():
if request.method == 'POST':
json_bytes = request.body
json_str = str(json_bytes, encoding='utf8')
json_dirt = json.loads(json_str)
print(json_dirt, type(json_dirt))
return render(request, 'index.html')
##需求三:传文件
"""
注意点:需要利用内置对象 Formdata,该对象既可以传普通的键值,也可以传文件
"""
#获取Input中用户上传文件的文件内容
#前端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>
$('b1').click(function(){
#1.先生成一个formdata对象
var myFormData = new FormData();
#2.朝对象中添加普通的键值(第一个参数是 name 字符串,就是key ,第二个参数是对应的值, 就是value)
myFormData.append('username', $("#t1").val());
myFormData.append('password', $("#t2").val());
#3.朝对象中添加文件数据
##1.先通过jquery查找到该标签(即$("#t3"),通过id找到该标签)
##2.将jquery对象转换成原生的js对象(上一步拿到的是列表套对象,然后索引0,取到js对象)
##3.利用原生js对象的方法 直接获取文件内容(上一步通过js对象,直接.files,拿到列表索引取第一个值)
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)
}
})
})
#后端代码
def upload(request):
if request.is_ajax():
if request.method == "POST":
print(request.FILES)
return HttpResponse('已接收')
return render(request, 'upload.html')
"""
ajax传文件需要注意的事项
1.利用formdata对象 能够简单的快速传输数据(普通键值 + 文件)
2.有几个参数:
data:formdata对象
contentType: false,
processData: false,
"""
3. contentType前后端传输数据编码格式
'''
form表单 默认的提交数据的编码格式是urlencoded
urlencoded
username=admin&password=123这种就是符合urlencoded数据格式
django后端针对username=admin&password=123的urlencoded数据格式会自动解析
将结果打包给request.POST 用户只需要从request.POST即可获取对应信息
formdata
django后端针对formdata格式类型数据 也会自动解析
但是不会方法request.POST中而是给你放到了request.FILES中
ajax ajax默认的提交数据的编码格式也是urlencoded
username=jason&password=123
总结:django后端针对不同的编码格式数据 会有不同的处理机制以及不同的获取该数据的方法(所以在进行前后端交互的时候,应该将传过去的数据格式告诉前端)
'''
4.序列化组件
'''
1.将用户表的数据 查询出来 返回给前端, 给前端的是一个大字典 字典里面的数据的一个个的字段
'''
#后端
from django.core import serializers
def ser(request):
#获取对象
user_queryset = models.Userinfo.objects.all()
# [{},{},{},{}]
# user_list = []
# for user_obj in user_queryset:
# user_list.append({
# 'username':user_obj.username,
# 'password':user_obj.password,
# 'gender':user_obj.get_gender_display(),
# })
#直接对拿到的对象进行序列化
res = serializers.serialize('json',user_queryset)
print(res)
return render(request,'ser.html',locals())
#前端(只需要用模板语法把res拿到就好了)
<body>
{{ res }}
</body>
5.ajax+sweetalert的小案例
## 前端代码
<!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>
{% load static %}
<link rel="stylesheet" href="{% static 'dist/sweetalert.css' %}">
<script src="{% static 'dist/sweetalert.min.js' %}"></script>
<style>
div.sweet-alert h2 {
padding-top: 10px;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h2>数据展示</h2>
<table class="table table-hover table-striped table-bordered">
<thead>
<tr>
<th>序号</th>
<th>用户名</th>
<th>密码</th>
<th>性别</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user_obj in user_queryset %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ user_obj.username }}</td>
<td>{{ user_obj.password }}</td>
<td>{{ user_obj.get_gender_display }}</td>
<td>
<a href="#" class="btn btn-primary btn-sm">编辑</a>
<a href="#" class="btn btn-danger btn-sm cancel" delete_id="{{ user_obj.pk }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<script>
$('.cancel').click(function () {
var $btn = $(this);
swal({
title: "你确定要删吗?",
text: "你要是删了,你就准备好跑路吧!",
type: "warning",
showCancelButton: true,
confirmButtonClass: "btn-danger",
confirmButtonText: "对,老子就要删!",
cancelButtonText: "算了,算了!",
closeOnConfirm: false,
showLoaderOnConfirm: true
},
function(){
$.ajax({
url:'',
type:'post',
data:{'delete_id':$btn.attr('delete_id')},
success:function (data) {
if (data.code==1000){
swal(data.msg, "你可以回去收拾行李跑路了.", "success");
// 1.直接刷新页面
{#window.location.reload()#}
// 2.通过DOM操作 实时删除
$btn.parent().parent().remove()
}else{
swal("发生了未知错误!", "我也不知道哪里错了.", "info");
}
}
});
});
})
</script>
</body>
</html>
##后端代码
"""
当你是用ajax做前后端 交互的时候
你可以考虑返回给前端一个大字典
"""
import time
from django.http import JsonResponse
def sweetajax(request):
if request.method == 'POST':
back_dic = {"code":1000,'msg':''}
delete_id = request.POST.get('delete_id')
models.Userinfo.objects.filter(pk=delete_id).delete()
back_dic['msg'] = '后端传来的:真的被我删了'
time.sleep(3)
return JsonResponse(back_dic)
user_queryset = models.Userinfo.objects.all()
return render(request,'sa.html',locals())
django之choice、ajax初步的更多相关文章
- Django中的Ajax
Ajax 很多时候,我们在网页上请求操作时,不需要刷新页面.实现这种功能的技术就要Ajax!(本人定义,不可迷信) jQuery中的ajax就可以实现不刷新页面就能向后台请求或提交数据的功能,我们仍然 ...
- django中的ajax组件
目录 django中的ajax 向服务器发送请求的途径 Ajax的特点 基于jquery实现的ajax请求 利用ajax实现计算器 利用ajax实现登陆认证 利用form表单进行文件上传 利用ajax ...
- Django框架 之 Ajax
Django框架 之 Ajax 浏览目录 AJAX准备知识 AJAX与XML的比较 AJAX简介 jQuery实现的ajax AJAX参数 AJAX请求如何设置csrf_token 序列化 一.AJA ...
- Django中的Ajax详解
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当 ...
- Django如何与ajax通信
示例一 文件结构 假设你已经创建好了一个Django项目和一个App,部分结构如下: mysite myapp |___views.py |___models.py |___forms.py |___ ...
- Django的日常-AJAX
目录 Django的日常-AJAX AJAX简介 AJAX与JQ的一个实例 AJAX与contentType AJAX传json格式 AJAX传文件 Django的日常-AJAX AJAX简介 首先A ...
- Django框架09 /ajax、crsf、settings导入
Django框架09 /ajax.crsf.settings导入 目录 Django框架09 /ajax.crsf.settings导入 1. ajax概述 2. ajax应用 3. ajax上传文件 ...
- Ajax初步理解
最近在项目中经常会使用Ajax技术,用法上倒是熟练了,但是只知其然,不知其所以然,抽时间读了读JavaScript高级程序设计中关于Ajax的介绍有了些初步的理解,在此总结一下. 什么是Ajax Aj ...
- Django基础——Form&Ajax篇
一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...
随机推荐
- github 入门教程之 github 访问速度太慢怎么办
github 是全世界最流行的开源项目托管平台,其代表的开源文化从根本上改变了软件开发的方式. 基本上所有的需求都能从 github 上或多或少找到现成的实现方案,再也不用重头开始造轮子而是自定义轮子 ...
- RPC调用和HTTP调用的区别
很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...
- 洛谷P3455 [POI2007]ZAP-Queries
题目大意: 给定\(n,m,k,\) 求 \[\sum\limits_{x=1}^n\sum\limits_{y=1}^m[gcd(x,y)==k]\] 莫比乌斯反演入门题,先进行一步转化,将每个\( ...
- MySQL实战45讲学习笔记:第三十九讲
一.本节概况 MySQL实战45讲学习笔记:自增主键为什么不是连续的?(第39讲) 在第 4 篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧 ...
- Pencil 基于Electron的GUI原型工具之菜单再探
为什么要重试呢? 主要是觉得Pencil这个工具还是比较有价值.就像Linus对Linux下分发版的态度"让用户有选择"一样,在现在这个Sass服务.Web服务化越来越普遍越便利的 ...
- python-5-str常用操作
前言 本节将讲解的是字符串 str 常用的操作方法,与 for 循环. 一.srt 常用操作 1.首个字母大写: # 1.首个字母大写 s = 'xiao long' s1 = s.capitaliz ...
- Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程
这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...
- WPF 通过Win32SDK修改窗口样式
使用函数为 SetWindowLong GetWindowLong 注册函数 [DllImport("user32.dll", EntryPoint = "GetWind ...
- 机器学习(九)-------- 聚类(Clustering) K-均值算法 K-Means
无监督学习 没有标签 聚类(Clustering) 图上的数据看起来可以分成两个分开的点集(称为簇),这就是为聚类算法. 此后我们还将提到其他类型的非监督学习算法,它们可以为我们找到其他类型的结构或者 ...
- wpf的控件树
转载自:控件树