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())

原文地址:https://www.cnblogs.com/michealjy/p/11756190.html

时间: 2024-10-11 22:24:48

django之choice、ajax初步的相关文章

Django中的Ajax详解

AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML".即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML). 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求:异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求.AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新:(这一特点给用户的感受是在不知不觉中完成请

Django的日常-AJAX

目录 Django的日常-AJAX AJAX简介 AJAX与JQ的一个实例 AJAX与contentType AJAX传json格式 AJAX传文件 Django的日常-AJAX AJAX简介 首先AJAX是一种无需重新加载整个网页的前提下,能够更新部分网页的技术,他并不是一种新的编程语言,而是一种使用现有标准的新方法,是基于原生JavaScript开发的,他可以用于创建快速动态网页. AJAX最大的特点就是局部刷新以及异步提交,局部刷新,顾名思义就是可以在不刷新整个页面的情况下局部刷新,而异步

django 使用jquery ajax post数据问题

django 开启了CSRF功能导致jquery ajax post数据报错 解决方法在post数据里引入csrfmiddlewaretoken: '{{ csrf_token }}'},同时需要在form表单中设置{% csrf_token %} <script src="/static/jquery/dist/jquery.min.js"></script> <script> $(function(){ $("#postset"

django中给ajax提交加上csrf

在html中的script标签下插入下面代码 在html文档加载时候运行下面代码,并且使用$.ajaxSetup设置ajax每次调用时候传入的数据,$.ajaxSetup进行默认的设置,只需要设置一次,每次ajax调用都会使用. 注意,以下代码使用了jquery,jquery.cookies.js 库.在head部分引用这些库,才能使得正常运行.另外需注意在某些特别情况下django并没有将csrftoken设置到cookie里面.那么这代码就失去了作用. $(document).ready(

django 用jquery ajax提交form 实现刷新部分页面

首先要引入jquery文件,可以引入在线的,也可以下载离线的 添加进自己staticfiles 这里演示的是添加离线的 <script src={% static 'jquery/jquery.min.js' %}></script> 注意这句是要添加到自己写的jquery脚本前边 然后写一个简单的表单 <form method="post" id="formadd"> {% csrf_token %} <label for

Django基础之Ajax

知识预览 Ajax前戏:json Ajax简介 Jquery实现的ajax JS实现的ajax Ajax前戏:json 什么是json? 定义: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输

Django 如何让ajax的POST方法带上CSRF令牌

大家知道,在大前端领域,有一种叫做ajax的东东,即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提交和请求数据.如果Django服务器接收的是一个通过ajax发送过来的POST请求的话,那么将很麻烦.何也?因为在ajax中,没有办法像form表单中那样携带{% csrf_token %}令牌.那怎么办呢?好办!在你的前端模版的JavaScript代码处,添加下面的代码: // 使用jQuer

Django之原生Ajax操作

Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件). 先通过代码来看看Ajax吧! views.py from django.shortcuts import render,redirect,HttpResponse from django import forms from django.forms import fields from app_01 import mod

django中使用Ajax

内容: 1.Ajax原理与基本使用 2.Ajax发送get请求 3.Ajax发送post请求 4.Ajax上传文件 5.Ajax设置csrf_token 6.django序列化 参考:https://www.cnblogs.com/liwenzhou/p/8718861.html 1.Ajax原理与基本使用 关于Ajax的原理及其基本使用,直接看这篇博文即可:https://www.cnblogs.com/wyb666/p/9387488.html 2.Ajax发送get请求 views.py: