Django---ajax

Django Ajax

知识点复习:
 Python序列化
        字符串 = json.dumps(对象)    对象->字符串
        对象 = json.loads(字符串)    字符串->对象
        
    JavaScript:
        字符串 = JSON.stringify(对象) 对象->字符串
        对象 = JSON.parse(字符串)     字符串->对象
        
    应用场景:
        数据传输时,
            发送:字符串
            接收:字符串 -> 对象


知识点扩充:


 事件委托


  $('要绑定标签的上级标签').on('click','要绑定的标签',function(){})


   如果用的javequery 1或2 版本需要---》 $('要绑定标签的上级标签').delegate('要绑定的标签','click',function(){})

 

1.基础功能:发送数据到服务器但不强制用户重新加载他们所在的整个页面

语法:
    $.ajax({                                  #$.ajax({})

url: 'abc',                              #url:"url地址",    
type: 'GET',                  #type:"发送方式:GET\POST",
data: {'k1':'v1'},                         #data:只是字符串或数字,   

dataType: 'JSON',                          #json字符串反序列化

success:function(arg){                    #回掉函数 # abc return 的值        
                                          # arg是字符串类型              
}
})

获取form表单的所有值

var data = $('#fmForm表单的ID').serialize();
$.ajax({
data: $('#fm').serialize()
})

 发送数据时: 

   data中的valve三种情况

        a. 只是字符串或数字
            $.ajax({
                url: 'http//www.baidu.com',
                type: 'GET',
                data: {'k1':'v1'},
                dataType: 'JSON',      
                success:function(arg){
                    // arg是对象
                }
            })
         b. 包含属组
            $.ajax({
                url: 'http//www.baidu.com',
                type: 'GET',
                data: {'k1':[1,2,3,4]},
                dataType: 'JSON',              
                traditional: true,          #包含属组发送必须加traditional
         success:function(arg){ // arg是对象  } })
c. 包含字典
$.ajax({
url:
'http//www.baidu.com', type: 'GET',
data: {
'k1': JSON.stringify({}) }, #json序列化
dataType:
'JSON',
success:function(arg){
// arg是对象 } })

 

 

 

 ajax方式发送请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
     <title>学生管理</title>
    <link rel="stylesheet" href="/static/plugins/bootstrap/css/bootstrap.css"/>
    <link rel="stylesheet" href="/static/plugins/font-awesome/css/font-awesome.css"/>


    <style>
        .icon {
            margin:0 5px;
        }
    </style>




</head>
<body>

<div class="container">
    <div style="padding: 20px 0;">
        <a class="btn btn-primary" id="addBtn">添加</a>
        <a class="btn btn-danger">删除</a>
    </div>

    <div>
        <table class="table table-bordered table-striped">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>班级</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody id="tb">
                {% for row in stu_list %}
                    <tr nid="{{ row.id }}">
                        <td na="nid">{{ row.id }}</td>
                        <td na="stdname">{{ row.stdname}}</td>
                        <td na="stdage">{{ row.stdage }}</td>
                        <td na="stdgender">{{ row.stdgender }}</td>
                        <td na="eidt_cls" cid="{{ row.cls.id}}">{{ row.cls.classname}}</td>

                        <td>
                            <a class="glyphicon glyphicon-remove icon del-row"></a>
                            <a class="fa fa-pencil-square-o icon edit-row"></a>
                        </td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>


        <ul class="pagination pagination-sm">
            {{ page_obj.page_str|safe }}
        </ul>
        <div style="height: 300px;"></div>
    </div>
</div>


<!-- Modal -->
{#添加学生#}
<div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">

    <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </button>


        <h4 class="modal-title" id="myModalLabel">添加学生</h4>


      </div>
{#        #from表单#}
      <div class="modal-body">

          <form class="form-horizontal">
              <div class="form-group">
                    <label for="username" class="col-sm-2 control-label">姓名</label>
                    <div class="col-sm-10">
                      <input type="text" class="form-control" id="username" name="username" placeholder="姓名">
                    </div>
              </div>
              <div class="form-group">
                    <label for="age" class="col-sm-2 control-label">年龄</label>
                    <div class="col-sm-10">
                      <input type="text" class="form-control" name="age" placeholder="年龄">
                    </div>
              </div>

                <div class="form-group">
                    <label  class="col-sm-2 control-label">性别</label>
                    <div class="col-sm-10">
                      <label class="radio-inline">
                                <input type="radio" name="gender" value="1"></label>

                      <label class="radio-inline">
                                <input type="radio" name="gender" value="0"></label>
                    </div>
                </div>
               <div class="form-group">
                    <label for="" class="col-sm-2 control-label">班级</label>
                    <div class="col-sm-10">
                        <select class="form-control" name="cls_id" >
                            {% for row in class_list %}
                                <option value="{{ row.id }}">{{ row.classname }}</option>
                            {% endfor %}
                        </select>
                    </div>
              </div>
            </form>
      </div>
      <div class="modal-footer">
          <span id="errorrMsg" style="color:red;"></span>
        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
        <button type="button" class="btn btn-primary" id="btnSave">保存</button>
      </div>
    </div>
  </div>
</div>

{#删除学生#}
<div class="modal fade" id="delModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
      <div class="alert alert-danger" role="alert">
            <h4>删除学生信息</h4>
          <div>...<input style="display: none;" type="text" id="delNid"/></div>
      </div>
      <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
            <button  id="delConfirm" type="button" class="btn btn-primary">确定</button>
      </div>
    </div>
  </div>
</div>
{##}
{#编辑学生#}
<div class="modal fade" id="eidtModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
        </button>
        <h4 class="modal-title " id="myModalLabel" >修改学生</h4>
      </div>
{#        #from表单#}
      <div class="modal-body">
          <form class="form-horizontal">
              <input type="text" class="form-control" style="display: none" name="nid" >

              <div class="form-group">
                    <label for="stdname" class="col-sm-2 control-label">姓名</label>
                    <div class="col-sm-10">
                      <input type="text" class="form-control" id="eidtname" name="stdname" placeholder="姓名">
                    </div>
              </div>
              <div class="form-group">
                    <label for="stdage" class="col-sm-2 control-label">年龄</label>
                    <div class="col-sm-10">
                      <input type="text" class="form-control" name="stdage" placeholder="年龄">
                    </div>
              </div>

                <div class="form-group">
                    <label  class="col-sm-2 control-label">性别</label>
                    <div class="col-sm-10">
                      <label class="radio-inline">
                                <input type="radio" name="stdgender" value="1"></label>

                      <label class="radio-inline">
                                <input type="radio" name="stdgender" value="0"></label>
                    </div>
                </div>
               <div class="form-group">
                    <label for="" class="col-sm-2 control-label">班级</label>
                    <div class="col-sm-10">
                        <select class="form-control" name="eidt_cls" >
                            {% for row in class_list %}
                                <option value="{{ row.id }}">{{ row.classname }}</option>
                            {% endfor %}
                        </select>
                    </div>
              </div>
            </form>
      </div>
      <div class="modal-footer">
          <span id="errorrMsg" style="color:red;"></span>
        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
        <button type="button" class="btn btn-primary" id="btneidt">保存</button>
      </div>
    </div>
  </div>
</div>





<script src="/static/js/jquery-3.1.1.js"></script>
<script src="/static/plugins/bootstrap/js/bootstrap.js"></script>


<script>
{#    #页面加载完毕后执行下面的函数#}
    $(function () {
        bindEvent();
        bindSave();
        bindDel();
        bindDelConfirm();
        bindEidt();
        bindEidtConfirm();
    });
   function bindEidt() {
        $("#tb").on('click','.edit-row',function () {
            $('#eidtModal').modal('show');
            $(this).parent().prevAll().each(function () {
                var  v=$(this).text();
                var  n=$(this).attr('na');
                if (n=='cls_id'){
                     var cid=$(this).attr('cid')
                     $('#eidtModal select[name="eidt_cls"]').val(cid)}
                else if(n=='stdgender'){if(v=="True"){$('#eidtModal :radio[value="1"]').prop('checked',true)}
                     else {$('#eidtModal :radio[value="0"]').prop('checked',true);}}
                else{$('#eidtModal input[name="'+n+'"]').val(v)}
            })
        }
            )}

    function bindEidtConfirm() {
        $('#btneidt').click(function () {
            var postData = {};
            $('#eidtModal').find('input,select').each(function () {
                var v = $(this).val();
                var n = $(this).attr("name");
                if (n == 'stdgender') {
                    if ($(this).prop('checked')) {
                        postData[n] = v;
                    }
                }
                else {
                    postData[n] = v;
                }
            });
            $.ajax({
                        url: "/eidtstudent",
                        type: 'POST',
                        data: postData,
                        dataType: 'JSON',
                        success: function (arg) {
                            if (arg.status) {window.location.reload();}
                            else {alert(arg.message);}
                        }

                   })
        })

    }




  function bindDel() {
        $('#tb').on('click','.del-row',function () {
            $("#delModal").modal('show');
            var nid=$(this).parent().parent().attr('nid');

            var n=$('#delNid').val(nid);


           })
    }
    function bindDelConfirm() {
        $('#delConfirm').click(function () {
            var nid=$('#delNid').val();
            $.ajax(
                    {
                        url: '/delstudent',
                        type: "GET",
                        data: {'nid': nid},
                        success: function (arg) {
                            var dict = JSON.parse(arg);
                            if (dict.status) {
                                $('tr[nid="' + nid + '"]').remove()
                            }
                              $("#delModal").modal('hide')
                        }
                    }
            )
        })
    }
    function bindEvent() {
        $('#addBtn').click(function () {
            $('#addModal').modal('show')
        })
    }

    function bindSave() {
           $('#btnSave').click(function () {
            var postData = {};
            $('#addModal').find('input,select').each(function () {
                var v = $(this).val();

                var n = $(this).attr("name");
                if(n=='gender'){
                    if($(this).prop('checked')){
                        postData[n] = v;
                    }
                }else{
                    postData[n] = v;
                }
            });
               console.log(postData);
            $.ajax({
                url:'/addstudent/',
                type:'POST',
                data:postData,
                success:function (arg) {
                     // arg是字符串
                    // JSON.parse将字符串转换成字典, json.loads
                    var dict=JSON.parse(arg);
                    if (dict.status){
{#                        window.location.reload();#}
                        createRow(postData,dict.data);
                    $('#addModal').modal('hide');

                    }else {$('#errorrMsg').text(dict.message);}}
            })
        });
    }

    function createRow(postData,nid) {

        var tr=document.createElement('tr');
         $(tr).attr('nid',nid)
        var tdid=document.createElement('td');
        tdid.innerHTML=nid;
        $(tr).append(tdid)

        var tdusername=document.createElement('td')
        tdusername.innerHTML=postData.username;
        $(tr).append(tdusername);

        var tdage=document.createElement('td');
        tdage.innerHTML=postData.age;
        $(tr).append(tdage);

        var tdgender = document.createElement('td');
        if(postData.gender=='0'){
            tdgender.innerHTML='False';
        }else{
            tdgender.innerHTML='True';
        }
        $(tr).append(tdgender);

        var tdcls=document.createElement('td');
        var text1=$('select[name="cls_id"]').find('option[value="'+postData.cls_id+'"]').text();
        tdcls.innerHTML=text1;
        $(tr).append(tdcls);

        var tdhandle='<td><a class="glyphicon glyphicon-remove icon del-row"></a><a class="fa fa-pencil-square-o icon edit-row"></a></td>'
         $(tr).append(tdhandle);
         $('#tb').append(tr);

            }
</script>
</body>
</html>
student.html
from django.conf.urls import url
from django.contrib import admin

from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^student/', views.students),
    url(r'^addstudent/$', views.addstudent),
    url(r'^delstudent$', views.delstudent),
    url(r'^eidtstudent$', views.eidtstudent),
url
class Pagination(object):
    def __init__(self,totalCount,currentPage,perPageitemNum=10,maxPageNum=7):
        self.total_count=totalCount
        try:
            v=int(currentPage)
            if v<=0:
                v=1
            self.current_page = v
        except Exception as e:
            self.current_page=1
        self.per_page_item_num=perPageitemNum
        self.max_page_num=maxPageNum
    def start(self):
        return ((self.current_page-1)*self.per_page_item_num)
    def end(self):
        return (self.current_page*self.per_page_item_num)
    @property
    def num_pages(self):
        a,b=divmod(self.total_count,self.per_page_item_num)
        if b==0:
            return a
        return a+1

    def pager_num_range(self):
        if self.num_pages<self.max_page_num:
#             如果总页数小于显示页码数
            return range(1,self.num_pages+1)
        part=int(self.max_page_num/2)

        # 如果当前页码比总页码数的一半 5
        if self.current_page<part:
            return range(1,self.max_page_num)


        if(self.current_page+part)>self.num_pages:
            return range(self.current_page  ,self.current_page+part+1)
        return range(self.current_page)

    def page_str(self):
        page_list = []

        first = "<li><a href='/student?p=1'>首页</a></li>"
        page_list.append(first)

        if self.current_page == 1:
            prev = "<li><a href='#'>上一页</a></li>"

        else:
            prev = "<li><a href='/teachers/?p=%s'>上一页</a></li>" % (self.current_page - 1)
            page_list.append(prev)

        for i in self.pager_num_range():
            if i == self.current_page:
                temp = "<li class='active'><a href='/student/?p=%s'>%s</a></li>" % (i, i)
            else:
                temp = "<li><a href='/teachers/?p=%s'>%s</a></li>" % (i, i)
            page_list.append(temp)
        if self.current_page == self.num_pages:
            nex = "<li><a href='#'>下一页</a></li>"
        else:
            nex = "<li><a href='/teachers/?p=%s'>下一页</a></li>" % (self.current_page + 1,)
        page_list.append(nex)
        last = "<li><a href='/teachers/?p=%s'>尾页</a></li>" % (self.num_pages,)
        page_list.append(last)
        return ''.join(page_list)
papert.py
from django.shortcuts import render,HttpResponse
import json
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# Create your views here.

from app01 import models
from app01 import paper
from app01.paper import  Pagination

def students(request):
    stu_list1=models.Students.objects.all()
    class_list=models.Classes.objects.all()

    current_page = current_page=request.GET.get('p')
    if not current_page:
        current_page='1'
    page_obj=Pagination(len(stu_list1),current_page)
    stu_list=stu_list1[page_obj.start():page_obj.end()]




    return render(request,'student.html',{'stu_list':stu_list,'class_list':class_list,'page_obj':page_obj})



def addstudent(request):
    response={"status":True,'message':None}
    try:
        u=request.POST.get("username")
        a=request.POST.get("age")
        g=request.POST.get("gender")
        c_id=request.POST.get("cls_id")
        print(u,a,g,c_id)
        obj=models.Students.objects.create(stdname=u,stdage=a,stdgender=g,cls_id=c_id)

        response['data'] = obj.id

    except Exception as e :
        response['status']=False
        response['message']='用户输入错误'

    result = json.dumps(response,ensure_ascii=False)
    return HttpResponse(result)




def delstudent(request):
    response = {"status": True, 'message': None}
    nid=request.GET.get('nid')
    print(666666666666666666666666666666666666666666666666666666666666666666666,nid)
    try:
        models.Students.objects.filter(id=nid).delete()
    except Exception as e:
        response['status']=False

    return HttpResponse(json.dumps(response))


def eidtstudent(request):
    response = {"status": True, 'message': None}
    try:
        nid = request.POST.get('nid')
        u = request.POST.get('stdname')
        a = request.POST.get('stdage')
        g = request.POST.get('stdgender')
        c = request.POST.get('eidt_cls')
        models.Students.objects.filter(id=nid).update(stdname=u,stdage=a,stdgender=g,cls_id=c)
    except Exception as e:
        response['status'] = False
        response['message'] = str(e)

    return HttpResponse(json.dumps(response))
views.py
posted @ 2017-03-19 20:59  红领巾下的大刀疤  阅读(1068)  评论(0)    收藏  举报
/* 看板娘 */