• 【Django】开发日报_10_Day:手机号码管理系统(8)


    0、设置随机数字验证码(补充)

    code.py
    在这里插入图片描述

    在这里插入图片描述

    1、Ajax请求

    在这里插入图片描述
    通常我们浏览器发送的GET、POST请求都会造成页面刷新,而使用Ajax请求就会在浏览器不刷新的情况下也能更新数据。
    在这里插入图片描述

    2、Ajax测试示例(1)
    (1)、DOM按钮绑定事件

    urls.py

    from app01.views import depart,user,pretty,admin,account,task
    #------------------任务管理---------------------------------------------------
        path('task/list/', task.task_list),
    

    views->task.py

    from django.shortcuts import render,redirect
    def task_list(request):
        """任务列表"""
        return render(request,"task_list.html")
    

    task_list.html

    {% extends "template.html" %}
    
    {% block content %}
        <div class="container">
            <h1>任务管理</h1>
    
            <h3>示例1</h3>
        <input type="button" class="btn btn-primary" value="点击" onclick="clickMe();"/>
        </div>
    {% endblock %}
    
    {% block js %}
        <script type="text/javascript">
            function clickMe(){
                console.log("点击了按钮");
            }
        </script>
    {% endblock %}
    

    修改模板template.html
    在这里插入图片描述
    在这里插入图片描述

    访问页面

    (2)、GET请求测试

    在这里插入图片描述

    urls.py

        path('task/ajax/', task.task_ajax),
    

    task,py

    from django.shortcuts import render,redirect,HttpResponse
    def task_list(request):
        """任务列表"""
        return render(request,"task_list.html")
    
    def task_ajax(request):
        print(request.GET)
        return HttpResponse("成功了")
    

    task_ajax.html

    {% extends "template.html" %}
    
    {% block content %}
        <div class="container">
            <h1>任务管理</h1>
    
            <h3>示例1</h3>
        <input type="button" class="btn btn-primary" value="点击" onclick="clickMe();"/>
        </div>
    {% endblock %}
    
    {% block js %}
        <script type="text/javascript">
            function clickMe(){
                $.ajax({
                    url:'/task/ajax/',
                    type:"get",
                    data:{
                        n1:123,
                        n2:456
                    },
                    sucess:function (res){
                        console.log(res);
                    }
                })
            }
        </script>
    {% endblock %}
    

    访问:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    (3)、POST请求测试

    直接修改type会发生报错,因为没有验证cookie中的csrftoken在这里插入图片描述
    这里采用直接避免验证的方式进行post请求的访问

    from django.shortcuts import render,redirect,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    def task_list(request):
        """任务列表"""
        return render(request,"task_list.html")
    
    @csrf_exempt
    def task_ajax(request):
        print(request.GET)
        print(request.POST)
        return HttpResponse("成功了")
    

    task_list.html

    {% extends "template.html" %}
    
    {% block content %}
        <div class="container">
            <h1>任务管理</h1>
    
            <h3>示例1</h3>
        <input type="button" class="btn btn-primary" value="点击" onclick="clickMe();"/>
        </div>
    {% endblock %}
    
    {% block js %}
        <script type="text/javascript">
            function clickMe(){
                $.ajax({
                    url:'/task/ajax/',
                    type:"post",
                    data:{
                        n1:123,
                        n2:456
                    },
                    sucess:function (res){
                        console.log(res);
                    }
                })
            }
        </script>
    {% endblock %}
    

    再次访问显示成功
    在这里插入图片描述

    (4)、JQuery按钮绑定事件
    {% block js %}
        <script type="text/javascript">
            $(function () {
                //页面框架加载完成之后代码自动执行
                bindBtn1Event();
            })
    
            function bindBtn1Event() {
                $("#btn1").click(function () {
                    $.ajax({
                        url: '/task/ajax/',
                        type: "post",
                        data: {
                            n1: 123,
                            n2: 456
                        },
                        sucess: function (res) {
                            console.log(res);
                        }
                    })
                })
            }
        </script>
    {% endblock %}
    
    (5)、Ajax请求的返回值(后台数据传输到前端)

    一般为JSON形式。
    方法1:

    import json
    from django.shortcuts import render,redirect,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    def task_list(request):
        """任务列表"""
        return render(request,"task_list.html")
    
    @csrf_exempt
    def task_ajax(request):
        print(request.GET)
        print(request.POST)
        data_dict = {
            "status":True,
            "data":[1,2,3,4]
        }
        json_string = json.dumps(data_dict)
        return HttpResponse(json_string)
    
    

    方法2:

    import json
    from django.http import JsonResponse
    from django.shortcuts import render,redirect,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    def task_list(request):
        """任务列表"""
        return render(request,"task_list.html")
    
    @csrf_exempt
    def task_ajax(request):
        print(request.GET)
        print(request.POST)
        data_dict = {
            "status":True,
            "data":[1,2,3,4]
        }
        #json_string = json.dumps(data_dict)
        #return HttpResponse(json_string)
        return JsonResponse(data_dict)
    

    在这里插入图片描述
    因为返回给前端的是字符串,处理起来比较麻烦,所以在前端拿到数据要进行反序列化处理,将数据类型设为JSON
    在这里插入图片描述
    直接获取前端值
    在这里插入图片描述
    访问页面
    在这里插入图片描述

    3、Ajax测试示例(2)前端数据传输到后台

    示例:bindBtn2Event

    {% extends "template.html" %}
    
    {% block content %}
        <div class="container">
            <h1>任务管理</h1>
    
            <h3>示例1</h3>
            <input type="button" id="btn1" class="btn btn-primary" value="点击"/>
    
            <h3>示例2</h3>
            <input type="text" id="txtName" placeholder="姓名"/>
            <input type="text" id="txtAge" placeholder="年龄"/>
            <input id="btn2" type="button" class="btn btn-primary" value="提交">
        </div>
    {% endblock %}
    
    {% block js %}
        <script type="text/javascript">
            $(function () {
                //页面框架加载完成之后代码自动执行
                bindBtn1Event();
                bindBtn2Event();
            })
    
            function bindBtn1Event() {
                $("#btn1").click(function () {
                    $.ajax({
                        url: '/task/ajax/',
                        type: "post",
                        data: {
                            n1: 123,
                            n2: 456
                        },
                        dataTypes: "JSON",
                        sucess: function (res) {
                            console.log(res);
                            console.log(res.status);
                            console.log(res.data);
                        }
                    })
                })
            }
    
            function bindBtn2Event() {
                $("#btn2").click(function () {
                    $.ajax({
                        url: '/task/ajax/',
                        type: "post",
                        data: {
                            name:$("#txtName").val(),
                            age:$("#txtAge").val(),
                        },
                        dataTypes: "JSON",
                        sucess: function (res) {
                            console.log(res);
                            console.log(res.status);
                            console.log(res.data);
                        }
                    })
                })
            }
    
        </script>
    {% endblock %}
    

    后台:

    import json
    from django.shortcuts import render,redirect,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    def task_list(request):
        """任务列表"""
        return render(request,"task_list.html")
    
    @csrf_exempt
    def task_ajax(request):
        print(request.GET)
        print(request.POST)
        data_dict = {
            "status":True,
            "data":[1,2,3,4]
        }
        json_string = json.dumps(data_dict)
        return HttpResponse(json_string)
    
    

    输出
    在这里插入图片描述

    4、Ajax测试示例(3)(使用form表单)

    当提交的数据过多时,也可使用表单提交

    <h3>示例3</h3>
            <form id="form3">
                <input type="text" name="name" placeholder="姓名"/>
                <input type="text" name="age" placeholder="年龄"/>
                <input type="text" name="email" placeholder="邮箱"/>
                <input type="text" name="more" placeholder="个人介绍"/>
            </form>
            <input id="btn3" type="button" class="btn btn-primary" value="发送">
    

    事件绑定并打包数据
    在这里插入图片描述
    前端
    在这里插入图片描述
    后台

    import json
    from django.shortcuts import render,redirect,HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    def task_list(request):
        """任务列表"""
        return render(request,"task_list.html")
    
    @csrf_exempt
    def task_ajax(request):
        print(request.GET)
        print(request.POST)
        data_dict = {
            "status":True,
            "data":[1,2,3,4]
        }
        json_string = json.dumps(data_dict)
        return HttpResponse(json_string)
    
    

    输出
    在这里插入图片描述

    5、Ajax项目实例(连接数据库)
    (1)创建一张任务表

    models.py

    class Task(models.Model):
        """任务"""
        level_choices = (
            (1, "紧急"),
            (2, "重要"),
            (3, "临时"),
        )
        level = models.SmallIntegerField(verbose_name="级别",choices=level_choices,default=1)
        title = models.CharField(verbose_name="标题",max_length=64)
        detail = models.TextField(verbose_name="详细信息")
        user = models.ForeignKey(verbose_name="负责人",to="Admin",on_delete=models.CASCADE)
    

    运行manage.py

    makemigrations
    migrate
    
    (2)查看数据库

    在这里插入图片描述

    (3)修改管理员表将对象显示成文字

    models.py

    class Admin(models.Model):
        """管理员"""
        username = models.CharField(verbose_name="用户名", max_length=32)
        password = models.CharField(verbose_name="密码", max_length=64)
        #当输出该类的对象时,显示对象名字
        def __str__(self):
            return self.username
    
    (4)为task表创建ModelForm

    form,py

    class TaskModelForm(BootStrapModelForm):
        class Meta:
            model = models.Task
            fields = "__all__"
            widgets = {
                "detail":forms.TextInput,
                #"detail": forms.Textarea,
            }
    
    
    (5)创建发送Ajax请求的网址

    urls.py

        path('task/add/', task.task_add),
    
    (6)创建和修改视图函数

    task.py

    import json
    from django.http import JsonResponse
    from django.shortcuts import render, redirect, HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    from app01.utils.form import TaskModelForm
    
    
    def task_list(request):
        """任务列表"""
        form = TaskModelForm()
        return render(request, "task_list.html", {"form": form})
    
    
    @csrf_exempt
    def task_ajax(request):
        print(request.GET)
        print(request.POST)
        data_dict = {
            "status": True,
            "data": [1, 2, 3, 4]
        }
        json_string = json.dumps(data_dict)
        return HttpResponse(json_string)
    
    
    @csrf_exempt
    def task_add(request):
        """添加任务"""
        #print(request.POST)
        # 
        # 1、对用户发送的数据表单进行校验(此处使用ModelForm进行校验)
        form = TaskModelForm(data=request.POST)
        if form.is_valid():
            form.save()
            data_dict = {"status": True}
            return JsonResponse(data_dict)
        data_dict = {
            "status": False,
            "error": form.errors
        }
        return JsonResponse(data_dict)
    
    
    (7)修改网页格式与Ajax事件绑定

    在这里插入图片描述

    在这里插入图片描述
    task_list.html

    {% extends "template.html" %}
    
    {% block content %}
        <div class="container">
            <!--实际案例-->
            <div class="panel panel-default">
                <div class="panel-heading">表单</div>
                <div class="panel-body">
                    <form id="formAdd">
                        <div class="clearfix"><!--与栅格连用-->
                            {% for obj in form %}
                                <div class="col-xs-6"><!--栅格为6-->
                                    <div class="form-group" style="position: relative;margin-bottom: 20px;">
                                        <label> {{ obj.label }} </label>
                                        {{ obj }}
                                        <span class="error-msg" style="color:red;position: absolute;"></span>
                                    </div>
                                </div>
                            {% endfor %}
                            <div class="col-xs-6">
                                <button id="btnAdd" type="button" class="btn btn-primary">提 交</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
    
            <!--学习样例-->
            <hr/>
            <h1>Ajax学习</h1>
            <h3>示例1</h3>
            <input type="button" id="btn1" class="btn btn-primary" value="点击"/>
            <h3>示例2</h3>
            <input type="text" id="txtName" placeholder="姓名"/>
            <input type="text" id="txtAge" placeholder="年龄"/>
            <input id="btn2" type="button" class="btn btn-primary" value="提交">
            <h3>示例3</h3>
            <form id="form3">
                <input type="text" name="name" placeholder="姓名"/>
                <input type="text" name="age" placeholder="年龄"/>
                <input type="text" name="email" placeholder="邮箱"/>
                <input type="text" name="more" placeholder="个人介绍"/>
            </form>
            <input id="btn3" type="button" class="btn btn-primary" value="发送">
        </div>
    {% endblock %}
    
    {% block js %}
        <script type="text/javascript">
            $(function () {
                //页面框架加载完成之后代码自动执行
                //学习案例
                bindBtn1Event();
                bindBtn2Event();
                bindBtn3Event();
                //实际案例
                bindBtnAddEvent();
            })
    
            function bindBtn1Event() {
                $("#btn1").click(function () {
                    $.ajax({
                        url: '/task/ajax/',
                        type: "post",
                        data: {
                            n1: 123,
                            n2: 456
                        },
                        dataTypes: "JSON",
                        success: function (res) {
                            console.log(res);
                            console.log(res.status);
                            console.log(res.data);
                        }
                    })
                })
            }
    
            function bindBtn2Event() {
                $("#btn2").click(function () {
                    $.ajax({
                        url: '/task/ajax/',
                        type: "post",
                        data: {
                            name: $("#txtName").val(),
                            age: $("#txtAge").val(),
                        },
                        dataTypes: "JSON",
                        success: function (res) {
                            console.log(res);
                            console.log(res.status);
                            console.log(res.data);
                        }
                    })
                })
            }
    
            function bindBtn3Event() {
                $("#btn3").click(function () {
                    $.ajax({
                        url: '/task/ajax/',
                        type: "post",
                        data: $("#form3").serialize(),
                        dataTypes: "JSON",
                        success: function (res) {
                            console.log(res);
                        }
                    })
                })
            }
    
            function bindBtnAddEvent() {
                $("#btnAdd").click(function () {//绑定按钮
    
                    $("#btnAdd").click(function () {
                        $(".error-msg").empty();
                    })
    
                    $.ajax({
                        url: '/task/add/',
                        type: "post",
                        data: $("#formAdd").serialize(),//表单数据
                        dataTypes: "JSON",
                        success: function (res) {
    
                            console.log(res.status);
                            if (res.status) {
                                alert("添加成功");
                            } else {
                                console.log(res.error);
                                $.each(res.error, function (name, data) {
                                    console.log(name.data);
                                    $("#id_" + name).next().text(data[0]);
                                })
                            }
                        }
                    })
                })
            }
        </script>
    {% endblock %}
    
    (8)网页访问

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    使用drawio的图层构建更强大的图表
    python yield含义
    条件表达式
    Flutter 5 大本地数据库解决方案
    虚拟机复制后,无法ping通问题解决
    OsgEarth3基础3D图形实现
    MPI之通信模式(标准,缓存,同步,就绪)
    【项目实战】Spring Boot项目抵御XSS攻击
    vue——VM对象和基础指令
    官媒代运营:2023年企业如何建立一个成功的品牌?
  • 原文地址:https://blog.csdn.net/qq_51701007/article/details/127080762