Ajax技术使用之ajax与模态框结合的妙用

Ajax技术使用之ajax与模态框结合的妙用

要求:

使用ajax的方式提交数据:https://www.cnblogs.com/-wenli/p/10470063.html

使用模态框完成增加数据,能完成增加,删除与修改也就很简单了。

HTML代码

关于在django中引用静态文件:https://www.cnblogs.com/-wenli/p/10470063.html

关于使用的css样式:https://v3.bootcss.com/css/

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     {%load staticfiles%}
  6     <link rel="stylesheet" href="{% static '/plugins/bootstrap-3.3.7-dist/css/bootstrap.css' %}">
  7     <link rel="stylesheet" href="{% static '/plugins/font-awesome-4.7.0/font-awesome-4.7.0/css/font-awesome.css' %}">
  8     <script src="{% static '/js/jquery/jquery-3.3.1.js' %}"></script>
  9     <title>Title</title>
 10 </head>
 11 <body>
 12 
 13 <div class="container">
 14     <div>
 15     <a type="button" class="btn btn-primary"  id="addBtn">添加</a>
 16     </div>
 17     <div>
 18         <table border="1" class="table table-bordered">
 19         <thead>
 20             <tr>
 21                 <th>ID</th>
 22                 <th>姓名</th>
 23                 <th>年龄</th>
 24                 <th>性别</th>
 25                 <th>班级</th>
 26                 <th>住址</th>
 27                 <th>行为</th>
 28             </tr>
 29          </thead>
 30         <tbody>
 31             {% for row in stu_list %}
 32                 <tr>
 33                     <td>
 34                          {{ row.id }}
 35                     </td>
 36                     <td>
 37                         {{ row.username }}
 38                      </td>
 39                     <td>
 40                         {{ row.age }}
 41                      </td>
 42                     <td>
 43                         {{ row.gender }}
 44                      </td>
 45                     <td>
 46                         {{ row.cs.title }}
 47                      </td>
 48                      <td>
 49                         {{ row.address }}
 50                      </td>
 51                     <td>
 52                         <a type="button" class="btn btn-primary" href="/delstudent.html?nid={{ row.id }}">删除</a>
 53                         <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
 54                         <a type="button" class="btn btn-primary" href="/altstudent.html?nid={{ row.id }}">编辑</a>
 55                         <span class="fa fa-edit" aria-hidden="true"></span>
 56 
 57                     </td>
 58                 </tr>
 59             {%  endfor %}
 60          </tbody>
 61 </table>
 62     </div>
 63 </div>
 64 
 65 <!--&lt;!&ndash; Button trigger modal &ndash;&gt;-->
 66 <!--<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">-->
 67   <!--Launch demo modal-->
 68 <!--</button>-->
 69 <!--默认通过id相同来关联使用-->
 70 <!-- Modal -->
 71 <div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
 72     <div class="modal-dialog" role="document">
 73         <div class="modal-content">
 74             <div class="modal-header">
 75                 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
 76                 </button>
 77                 <h4 class="modal-title" id="myModalLabel">创建学生</h4>
 78             </div>
 79 
 80             <div class="modal-body">
 81 
 82                     <div class="form-group">
 83                         <label for="exampleInputEmail1">姓名:</label>
 84                         <input type="text" class="form-control" id="exampleInputEmail1" name="username" placeholder="name">
 85                     </div>
 86 
 87                     <div class="form-group">
 88                         <label for="exampleInput">年龄:</label>
 89                         <input type="text" class="form-control" id="exampleInput" name="age" placeholder="age">
 90                     </div>
 91 
 92                      <div class="form-group">
 93                         <label for="exampleInputEmail1">性别:</label>
 94                          <label class="checkbox-inline">
 95                          <input type="radio"  name="gender" value="1"> 96                         </label>
 97                          <label class="checkbox-inline">
 98                         <input type="radio"  name="gender" value="0"> 99                           </label>
100                     <div>
101 
102 
103                     <div class="form-group">
104                     <select class="form-control" name="class">
105                         {% for row in obj %}
106                              <option value="{{ row.id }}">{{ row.title }}</option>
107                         {% endfor %}
108                     </select>
109                       <div>
110 
111                      <div class="form-group">
112                         <label for="exampleInputEmail1">住址:</label>
113                         <input type="text" class="form-control" id="exampleInputaddress" placeholder="address" name="address">
114                     </div>
115 
116             </div>
117             <div class="modal-footer">
118                 <span id="errMsg" style="color:red;"></span>
119                 <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
120                 <button type="button" class="btn btn-primary" id="btnSave">确定</button>
121             </div>
122 
123         </div>
124     </div>
125 </div>
126 
127 <script src="{% static '/plugins/bootstrap-3.3.7-dist/js/bootstrap.js' %}"></script>
128 <script>
129     <!--#调用函数-->
130     <!--页面加载完后执行的函数 -->
131     $(function(){
132         bindEvent();
133         bindSave();
134     });
135     <!--#绑定函数-->
136     function bindEvent(){
137         $('#addBtn').click(function(){ 
138             $('#addModal').modal('show');
139             <!--#通过js的方法调用模态对话框-->
140         })
141      }
142     function bindSave(){
143 
144          $('#btnSave').click(function(){
145             var postData={};
146          <!--#在id为addModal的标签下找input与select标签-->
147             $('#addModal').find('input,select').each(function(){
148             console.log(this);
149             var v =$(this).val();
150             var n=$(this).attr('name');
151             if(n=='gender'){
152                 if($(this).prop('checked')){
153                     postData[n]=v;
154                 }
155             }
156             else{
157             postData[n]=v;
158             }
159             });
160             console.log(postData)
161 
162          $.ajax({
163             url:"/addstudent.html/",
164             type:'POST',
165             data:postData,
166             success:function(arg){
167                 console.log(arg);
168                 <!--JSON.parse()将字符串转换为字典-->
169                  var dict=JSON.parse(arg);
170                  if(dict.status){
171                      window.location.reload();
172                     }
173                   else{
174                      $('#errMsg').text(dict.message);
175                   }
176 
177             }
178          })
179 
180         })
181 
182      }
183 
184 </script>
185 </body>
186 </html>

视图函数

 1 from django.shortcuts import render,HttpResponse,redirect
 2 from app01 import models
 3 
 4 def get_student(request):
 5     stu_list = models.Student.objects.all()
 6     obj = models.Classes.objects.all()
 7 
 8     print(stu_list)
 9     print(obj)
10     # return HttpResponse('ok')
11     return render(request, "get_student.html", {'stu_list': stu_list,'obj':obj})
12 def add_student(request):
13     response={'status':True,'message':None}
14     try:
15         name = request.POST.get('username')
16         age = request.POST.get('age')
17         gender = request.POST.get('gender')
18         cs_id = request.POST.get('class')
19         address = request.POST.get('address')
20         print(name, age, gender, cs_id, address)
21         models.Student.objects.create(username=name, age=age, gender=gender, cs_id=cs_id, address=address)
22     except Exception as e:
23         response['status']=False
24         response['message']='用户输入错误'
25     import json
26     result=json.dumps(response,ensure_ascii=False)
27     return HttpResponse(result)
28         # ret=models.Classes.objects.all().values('title')
29         # for Title in ret:
30         #     if Title['title']==title:
31         #         print(Title)
32 
33         # 注意这里是url路径
34 
35 
36 
37 
38 
39 def del_student(request):
40     nid = request.GET.get('nid')
41     print(nid)
42     ret = models.Student.objects.filter(id=nid).delete()
43     print(ret)
44     return redirect('/student.html/')
45 def alt_student(request):
46     if request.method=="GET":
47         nid = request.GET.get('nid')
48         obj=models.Student.objects.filter(id=nid)[0]
49         cs_list = models.Classes.objects.all()
50         return render(request,'alt_student.html',locals())
51 
52     elif request.method=="POST":
53         nid=request.GET.get("nid")
54         name = request.POST.get('name')
55         age = request.POST.get('age')
56         gender = request.POST.get('gender')
57         cs_id = request.POST.get('class')
58         address = request.POST.get('address')
59         print(name, age, gender, cs_id, address)
60         # models.Student.objects.filter(id=nid).update(username=name,age=age,gender=gender,cs_id=cs_id,address=address)
61         return redirect("/student.html/")

路由

1 from django.contrib import admin
2 from django.urls import path
3 from app01.views import *
4 urlpatterns = [
5 path('altclasses.html/',alt_classes),
6 path('student.html/', get_student),
7 path('addstudent.html/',add_student),
8 path('delstudent.html/',del_student),
9 ]


具体实现测试

代码分析:

使用ajax提交数据

url:提交地址

type:数据传输的方式,支持所有http方法

data:传输的数据为键值对格式

succes:function(arg){

//执行代码

}

这个函数只有服务端返回的信息到达客户端才会执行,这个很重要,比如添加完数据,在函数里自动刷新页面,如果数据格式错误,将服务端返回的信息,在这里就行处理,显示到页面上。

 而arg为服务端返回的数据,为字符串

这里就要补充一下在python下,以及javascript下的序列化。

如果我们使用下面第一种方法,需要自行进行反序列化,JSON.parse()。

如果使用第二种方法:只需要加上dataType:'JSON',ajax自动帮我们完成反序列化。

 

绑定模态框

找到
id="addModal"的div:为模态框
id="addBtn"的a标签:为添加按钮
我们需要为按钮绑定事件,点击按钮就会出现模态框
  function bindEvent(){
        $('#addBtn').click(function(){
            $('#addModal').modal('show');
            <!--#通过js的方法调用模态对话框-->
        })
     }
注意 :

$('#addModal').modal('show');
为js的方式打开模态框。

获取模态框里的数据,并发送

我们的思路是获取标签的name属性与标签里的值,构成字典发送过去,注意这里面会获取两次radio,去掉我们没有选择的radio,我们点击选择的radio会有属性。

1.绑定事件,确定的时候提交数据,触发事件

找到模态框与确定按钮的id

 $('#btnSave').click(function(

  

2.创建空字典

var postData={}

3.

首先所有获取所有的input与select标签

$('#addModal').find('input,select').each(function(

  

4.

 打印获取到的标签

将所有标签的值赋给v

将所有标签的name属性的值赋给n

 console.log(this);
 var v =$(this).val();
 var n=$(this).attr('name');

  

 5.

如果n的属性里有gender则进行剔除,最后赋值,打印一遍符合要求的标签

  if(n=='gender'){
                if($(this).prop('checked')){
                    postData[n]=v;
                }
            }
            else{
            postData[n]=v;
            }
            });
            console.log(postData)

  

 6.最后发送数据。

 补充知识点:

$('#fm').serialize()
原文地址:https://www.cnblogs.com/-wenli/p/10474141.html