choice参数、MTV与MVC模型、Ajax

choice参数

choice 参数应用场景
用户性别
用户学历
用户工作状态
客户来源
...
示例:
choices = (
(1,'male'),
(2,'female'),
)
gender = models.IntegerField(choices=choices)
# 就是把你想要的选择先写出来,放在一个对应的元祖里,优点就是使用起来更方便,减少代码冗余.

# 调用的方法:
from app01 import models
user_obj = models.Userinfo.object.filter(pk=4).first()
print(user_obj.username)

print(user_obj.gender) #错误语法
# 针对choices字段 如果你想要获取数字所对应的中文,你不能直接点字段
# 固定句式    数据对象.get_字段名_display() 当没有对应关系的时候,该句式获取到的还是数字
print(user_obj.get_gender_display())

更多应用场景:
record_choices = (
('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
#你当然也不用非要用数字代替,其他的对应也可以
)
record = models.CharField("上课记录", choices=record_choices, default="checked")
# 括号里的choices就等于你自己写的对应关系, 当然你也可以设置默认值.
 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)

MTV与MVC模型(了解)

django号称是MTV框架,其实他还是MVC框架
MTV:
   M: models
   T: templtes
   v: views
MVC:
   M: models
   V: views
   C: contronner(路由配置)

Ajax

同步异步:
   同步:提交任务之后,原地等待任务的返回结果,期间不做其他的事情
   异步:提交任务之后,不原地等待,直接执行下一个,任务的返回通过回调机制

阻塞非阻塞:
    描述的程序的运行状态:
    就绪--运行--阻塞

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

Ajax是一门js的技术,是基于js开发的,但是用原生的js写代码的过于繁杂,我们用JQuery实现ajax

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

 

Ajax示例

1.展示一个前端页面,页面上有三个输入框, 前两个输入数字,点击按钮朝后端发送请求,在页面不刷新的情况下载第三个框显示前两个相加的结果.
eg:
 <input type='text' id='t1'>+<input type='text' id='t2'>=<input type='text' id='t3'>
 <p><button id='b1'>计算</button></p>

 # 在按钮上触发点击事件.
 $('#b1').on('click', function(){
 // 朝后端提交post数据,写ajax
 $.ajax({
    // 1.往哪个地址发送数据
    url:'', //不写的话就默认当请地址
    // 2.请求的格式
    type:'post', //专门定制ajax发送的请求方式.
    // 3.发送什么数据
    data:{'t1':$('#t1').val(), 't2':$('#t2').val()}, 获取前两个输入框输入的内容
    // 4.异步提交的任务, 需要通过回调函数来处理
    success:function (data){ //data形参指代的就是异步提交的返回结果}
    // 通过DOM操作将内容渲染到标签内容上
    $('#t3').val(data)  // ,这里写data就是最后结果.
 })
 }

 def index(request):
      if request.is_ajax():  # 判断当前的请求是否是ajax,然后在判断是否是post请求.然后做逻辑处理.让获取到的两个数字相加. res的结果经过ajax的处理会直接展示在第三个框里.
           if request.method == 'POST':
               t1 = request.POST.get('t1')
               t2 = request.POST.get('t2')
               res = int(t1) + int(t2)
               return HttpResponse(res)

Ajax传json格式的数据

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

后端手动处理
json_bytes = request.body  #拿到jsoon格式数据,是二进制的
json_str = str(json_bytes, encoding='utf8') # 转成utf8格式
json_dict = json.loads(json_str) #拿到数据

#注意点:
1.指定contentType参数
     contentType: 'application/json', 传送json格式
2.你要发送的数据也要确保是json格式的,确保一致.
     data:JSON.stringify({'username':'kang','password':'123'})

Ajax传文件

# ajax传文件需要利用内置对象 Formdata,该对象既可以传文件也可以传普通的键值

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

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

ajax文件需要注意的事项.
  1.利用formdata对象 能够简单的快速传输数据(普通键值 + 文件)
  2.有几个参数
     data: formdata对象

     contentType:false
     processData:false
                                                          

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

form表单 默认的提交数据的编码格式是urlencoded
  urlencoded
      1.username=admin&password=123这种就是符合urlencoded数据格式.

      2.django后端针对username=admin&password=123的数据格式会自定解析将结果打包给rquest.POST 用户只需要从request.POST即可获取对应的信息.

   formdata
      1.django后端针对formdata格式类型数据,也会自动解析
      2.但是不会针对request.POST中而是给你放到了request.FILES中

总结: django后端针对不同的编码格式,会有不同的处理机制以及不同的获取该数据的方法.
注意:前后端在做数据交互的时候,一定一定要表名你所发的数据格式到底是什么格式.

序列化组件
1.将用户表的数据 查询出来, 返回给前端(给前端的是一个大字典, 字典里的数据的一个个字段)
from django.core import serializers #导入此模块可以直接把数据转成json类型
def ser(request):
    user_queryset = models.Userinfo.object.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) #变为json类型
    return render(request, 'ser.html', local()) #发送到前端.

ajax + sweetalert的应用

$("#b55").click(function () {
    swal({
                title: "你确定要删除吗?",
                text: "删除可就找不回来了哦!",
                type: "warning",
                showCancelButton: true,  // 是否显示取消按钮
                confirmButtonClass: "btn-danger",  // 确认按钮的样式类
                confirmButtonText: "删除",  // 确认按钮文本
                cancelButtonText: "取消",  // 取消按钮文本
                closeOnConfirm: false,  // 点击确认按钮不关闭弹框
                showLoaderOnConfirm: true  // 显示正在删除的动画效果
            },

          function(){
              var deleteId = 2;
              $.ajax({
                 url:"/delete_book",
                 type:"post",
                 data:{"id":deleteId},
                 success: function (data){
                     if (data.code === 0){
                         swal("删除成功!", "success")
                     } else {
                         swal("删除失败", "error")
                     }
                 }
              })
          }

12-27 09:46