Django与AJAX、choice字段、MTV和MVC模型、sweetalert搭建页面

Django中的choice字段

  应用的场景:

    用户信息举列:如用户性别、婚否、学历、工作状态等可以列举出来供选择的信息

书写models创建表模型:

数据的获取和查询:

 总结:

"""
      1 存choice里面罗列的数字与中文对应关系
           print(user_obj.get_gender_display())
              只要是choices字段 在获取数字对应的数据 固定语法
              get_choices字段名_display()

      2 存没有罗列出来的数字
          不会报错 还是展示数字
      """

MTV和MVC框架 (了解概念)

   MTV:是Django框架,自己自称的

    M:models模型

    T:templates模板

    V:views视图

   MVC:目前大部分web框架的本质

    M:models

    V:views

    C:controller  控制器(urls)

本质:MTV其实也是MVC

Django与AJAX

  关键理解:异步提交,局部刷新

例如github官网的注册界面:

  注册用户名时,时刻监测用户名是否存在,向后端发送请求

目前所接触到的向后端发送请求方式:

  GET/POST请求

"""
前端中的<a> </a>标签 >>>>>GET请求       
浏览器中输入的url搜索>>>>>GET请求  
from表单  >>>>>>>>>>>>>>>GET/POST请求
AJAX》>>>>>>>>>>>>>>>>>GET/POST请求

"""

AJAX简介

AJAXAsynchronous Javascript And XML)翻译成中文就是异步的JavascriptXML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

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

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

AJAX:有点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

例子:

页面上有三个input框,在前两个input框中输入数字,点击按钮 发送ajax请求 不刷新页面的情况下,第三个框中自动算出两数之和。

前端向后端发送请求需注意:

 views.py

from django.shortcuts import render,reverse,HttpResponse,redirect

# Create your views here.

def index(request):
    print(request.is_ajax())  # 用来判断当前请求方式是否是ajax请求
    if request.is_ajax():
        if request.method == 'POST':
            # print(request.POST)
            i1 = request.POST.get('i1')
            i2 = request.POST.get('i2')

            # 后端获取的前端数据 都是字符串格式
            res = int(i1) + int(i2)
            return HttpResponse(res)
        return reverse(request,'index.html')

url,py

from django.conf.urls import url
from django.contrib import admin
from app01 import views


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/',views.index),
]

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
     <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.slim.js"></script>
</head>
<body>
<input type="text" id="l1">+<input type="text" id="l2">=<input type="text" id="l3">
<button id="l3">求和</button>
<script>
    $('#l3').on('click',function () {
                {#alert(123)#}
                // 点击按钮 朝后端发送post请求
                $.ajax({
                    url:'',  // 控制发送给谁 不写就是朝当前地址提交
                    type:'post',  // 发送方式是post请求
                    data:{'i1':$('#l1').val(),'l2':$('#l2').val()},  // 发送的数据
                    success:function (data) {  // data形参用来接收异步提交的结果
                        // 将后端计算好的结果 通过DOM操作 渲染到第三个input框中
                        $('#l3').val(data)
                    }
                })
            })
</script>
</body>
</html>

AJAX部分

运行的结果是:点击求和后向后端发送POST请求,取到结果并展示

 

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

常用的数据编码格式有三类:

  1.urlencoded
    2.formdata
     3.json

  form 表单:默认使用的编码格式是urlencoded,数据格式是:name=jason&pwd=123;发送到后端,

django后端针对urlencoded编码格式的数据会自动解析并放到request.POST中供用户获取。

可以修改为formdata 传文件
    django后端针对只要是符合urlencoded编码格式的数据(name=jason&pwd=123)都会自动解析并放到request.POST中供用户获取
    如果是文件 只要你指定的编码是formdata 就会自动解析并放到request.FILES中

ajax提交数据:提交的方式默认也是urlencoded

ajax发送json格式数据

<script>
    $('#b1').on('click',function () {
        alert(123)
        // 点击按钮 朝后端发送post请求
        $.ajax({
            url:'',  // 控制发送给谁 不写就是朝当前地址提交
            type:'post',  // 发送方式是post请求
            data:JSON.stringify({'username':'jason','password':123}),  // 发送的数据
            contentType:'application/json',  // 告诉后端你这次的数据是json格式

            success:function (data) {  // data形参用来接收异步提交的结果
                alert(data)
                // 将后端计算好的结果 通过DOM操作 渲染到第三个input矿中
                $('#i3').val(data)
            }

        })
    // {)
</script>

后端验证数据格式:

def index(request):

#验证前后端传输数据的编码格式
    if request.method =='POST':
        print('request.POST',request.POST)
        print('request.FILES',request.FILES)
        jason_str = request.body
        import json
        # 后端 需要手动去request.body中获取json格式数据 自己处理
        res = jason_str.decode('utf-8')
        ral_d = json.loads(res)
        print(ral_d)
        return HttpResponse('OK')
    return render(request,'index.html')

总结:前后端在传输数据的时候,一定要保证数据格式和你的编码保持一致性的.

基于AJAX传文件:

  关键字formData

传文件:如何获取文件标签存储的问文件对象?固定的语法

  1、先用jQuery查找到存储文件的input标签

  2、将jQuery对象转成原生Javascript对象

  3、利用原生Javascript对象的方法.files[0]获取到标签内部存储的文件对象

{#// ajax传输文件#}
    $('#b1').on('click',function () {
        // ajax传输文件 建议使用内置对象formdata
        var formData = new FormData();  // 既可以传普通的键值对 也可以传文件
        // 添加普通键值
        formData.append('username','jason');
        formData.append('password','123');
        //固定的格式
        formData.append('my_file',$('#d1')[0].files[0]);
        $.ajax({
            url:'',  // 控制发送给谁 不写就是朝当前地址提交
            type:'post',  // 发送方式是post请求
            data:formData, // 发送的数据
            // ajax发送文件需要指定两个额外的参数
            
            processData:false,  // 告诉前端不要处理数据
            contentType:false,  // 不适用任何编码,因为formdata对象自身自带编码 django后端也能够识别formdata对象
            success:function (data) {  // data形参用来接收异步提交的结果
                alert(data)
                // 将后端计算好的结果 通过DOM操作 渲染到第三个input矿中
                $('#i3').val(data)
            }

        })

注意固定的格式及一些参数的使用

序列化组件

  Django内置的serializers

  简单的解释就是前端想拿到由ORM得到数据库中里面得一个个用户对象,为了简便操作,

后端直接将实例化出来的数据对象直接发送给客户端,这时候就需要用到序列化模块。

主要是考虑Json序列化字典的数据格式,传输的数据类型比较多,也可以以K:V键值对的形式取值。

from django.core import serializers  # django自带的一个小型的序列化工具
def reg(request):
    user_list = models.User.objects.all()
  原来的数据传输:
# 将所有的数据都组织成一个符合json的一个个的字典 # user_l = [] # for user_obj in user_list: # user_l.append( # json.dumps({'username':user_obj.username, # 'age':user_obj.age, # 'gender':user_obj.get_gender_display() # }) # ) res = serializers.serialize('json',user_list) # return render(request,'index.html',locals())

 利用在这json在线格式转换工具:

 AJAX结合sweetalert插件的应用(动态弹框)

  

  

猜你喜欢

转载自www.cnblogs.com/Gaimo/p/11575462.html