ajax传输数据与分页器

ajax发送json数据的格式

复制代码
# ajax默认提交的数据格式是 urlencoded
'''
    发送的数据类型和数据格式要保持一致
'''

$('.btn').click(function () {
        $.ajax({
            url: '',
            type: 'post',
            data: JSON.stringify({'d1': 'aaa'}), // 序列化 json
            contentType: 'application/json',  // 代表发送的数据是json格式
            success: function (res) {
                console.log(res)
            }

        })
    })
复制代码

ajax发送文件数据

复制代码
$('.btn').click(function () {
        // ajax上传文件需要借助于FormData
        // 1. 实例化FormData
        var obj = new FormData()

        // 增加数据
        obj.append('username', $('#username').val());
        obj.append('username', $('#password').val());

        // 增加文件数据,先将jquery对象转为document对象在使用files方法获取文件
        obj.append('myfile', $("#myfile")[0].files[0])

        $.ajax({
            url: '/upload_file/',
            type: 'post',
            data: obj, // 序列化 json

            contentType:false, // 告诉浏览器不要修改提交的数据格式
            processData:false,  // 告诉浏览器不要对提交的数据进行任何的更改
            success: function (res) {
                console.log(res)
            }

        });
    })
复制代码

Django自带的序列化组件

复制代码
import json
from django.http import JsonResponse
from django.core import serializers
def ab_ser(request):
    user_queryset = models.User.objects.all()
    # [{},{},{},{},{}]
    # user_list = []
    # for user_obj in user_queryset:
    #     tmp = {
    #         'pk':user_obj.pk,
    #         'username':user_obj.username,
    #         'age':user_obj.age,
    #         'gender':user_obj.get_gender_display()
    #     }
    #     user_list.append(tmp)
    # return JsonResponse(user_list,safe=False)
    # return render(request,'ab_ser.html',locals())

    # 序列化
    res = serializers.serialize('json',user_queryset)
    """会自动帮你将数据变成json格式的字符串 并且内部非常的全面"""
    return HttpResponse(res)
复制代码

 

ajax结合sweetalert实现删除键二次确认

前端

复制代码
<h1 class="text-center">数据展示</h1>
<div class="container">
    <table class="table table-hover table-striped">
        <thead>
        <tr>
            <th>id</th>
            <th>name</th>
            <th>gender</th>
            <th>age</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for foo in obj %}
            <tr>
                <td>{{ foo.pk }}</td>
                <td>{{ foo.name }}</td>
                <td>{{ foo.get_gender_display }}</td>
                <td>{{ foo.age }}</td>
                <td>
                    <button class="btn btn-danger" delete_id="{{ foo.pk }}">删除</button>
                </td>
            </tr>

        {% endfor %}

        </tbody>
    </table>

<script>
    $('.del').on('click',function () {
        // 先将当前标签对象存储起来
        let currentBtn = $(this);
        // 二次确认弹框
        swal({
          title: "你确定要删吗?",
          text: "你可要考虑清除哦,可能需要拎包跑路哦!",
          type: "warning",
          showCancelButton: true,
          confirmButtonClass: "btn-danger",
          confirmButtonText: "是的,要删!",
          cancelButtonText: "算了,算了!",
          closeOnConfirm: false,
          closeOnCancel: false,
          showLoaderOnConfirm: true
        },
        function(isConfirm) {
          if (isConfirm) {
                // 朝后端发送ajax请求删除数据之后 再弹下面的提示框
                $.ajax({
                    {#url:'/delete/user/' + currentBtn.attr('delete_id'),  // 1 传递主键值方式1#}
                    url:'/delete/user/',  // 2 放在请求体里面
                    type:'post',
                    data:{'delete_id':currentBtn.attr('delete_id')},
                    success:function (args) {  // args = {'code':'','msg':''}
                        // 判断响应状态码 然后做不同的处理
                        if(args.code === 1000){
                            swal("删了!", args.msg, "success");
                            // 1.lowb版本 直接刷新当前页面
                            {#window.location.reload()#}
                            // 2.利用DOM操作 动态刷新
                            currentBtn.parent().parent().remove()
                        }else{
                            swal('完了','出现了位置的错误','info')
                        }
                    }

                })

          } else {
            swal("取消删除", ":)", "error");
          }
        });
    })

</script>
复制代码

后端

复制代码
from app01 import models


def db_list(request):
    obj = models.User.objects.all()
    return render(request, 'list.html', locals())


from django.http import JsonResponse


def delete(request):
    delete_id = request.POST.get('delete_id')
    print(delete_id)
    models.User.objects.filter(pk=delete_id).delete()
    info_dict = {'code': 1000, 'msg': '删除成功'}
    return JsonResponse(info_dict)
复制代码

批量插入数据

普通方法(该方法效率很低)

复制代码
from django.shortcuts import render, HttpResponse, redirect
from app01 import models

def get_book(request):
  # for循环插入1000条数据
  for i in range(1000):
    models.Book.objects.create(name='第%s本书'%i)
  book_queryset = models.Book.objects.all()     # 将插入的数据再查询出来
  return render(request,'get_book.html',locals())  # 将查询出来的数据传递给html页面
复制代码

bulk_create方法(该方法效率很高)

obj_list = []
for i in range(1000):
       book_obj = models.Book(title='第%s本书' % i)  # 生成book对象
       obj_list.append(book_obj)
models.Book.objects.bulk_create(obj_list) # 使用bulk_create方法快速插入数据

 

简易分页

复制代码
# 分页
    book_list = models.Book.objects.all()

    # 想访问哪一页
    current_page = request.GET.get('page',1)  # 如果获取不到当前页码 就展示第一页
    # 数据类型转换
    try:
        current_page = int(current_page)
    except Exception:
        current_page = 1
    # 每页展示多少条
    per_page_num = 10
    # 起始位置
    start_page = (current_page - 1) * per_page_num
    # 终止位置
    end_page = current_page * per_page_num

    # 计算出到底需要多少页
    all_count = book_list.count()

    page_count, more = divmod(all_count, per_page_num)
    if more:
        page_count += 1

    page_html = ''
    xxx = current_page
    if current_page < 6:
        current_page = 6
    for i in range(current_page-5,current_page+6):
        if xxx == i:
            page_html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
        else:
            page_html += '<li><a href="?page=%s">%s</a></li>'%(i,i)



    book_queryset =  book_list[start_page:end_page]
复制代码

 自定义分页器的拷贝与使用

自定义分页器代码

复制代码
class Pagination(object):
    def __init__(self, current_page, all_count, per_page_num=2, pager_count=11):
        """
        封装分页相关数据
        :param current_page: 当前页
        :param all_count:    数据库中的数据总条数
        :param per_page_num: 每页显示的数据条数
        :param pager_count:  最多显示的页码个数
        """
        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1

        if current_page < 1:
            current_page = 1

        self.current_page = current_page

        self.all_count = all_count
        self.per_page_num = per_page_num

        # 总页码
        all_pager, tmp = divmod(all_count, per_page_num)
        if tmp:
            all_pager += 1
        self.all_pager = all_pager

        self.pager_count = pager_count
        self.pager_count_half = int((pager_count - 1) / 2)

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_num

    @property
    def end(self):
        return self.current_page * self.per_page_num

    def page_html(self):
        # 如果总页码 < 11个:
        if self.all_pager <= self.pager_count:
            pager_start = 1
            pager_end = self.all_pager + 1
        # 总页码  > 11
        else:
            # 当前页如果<=页面上最多显示11/2个页码
            if self.current_page <= self.pager_count_half:
                pager_start = 1
                pager_end = self.pager_count + 1

            # 当前页大于5
            else:
                # 页码翻到最后
                if (self.current_page + self.pager_count_half) > self.all_pager:
                    pager_end = self.all_pager + 1
                    pager_start = self.all_pager - self.pager_count + 1
                else:
                    pager_start = self.current_page - self.pager_count_half
                    pager_end = self.current_page + self.pager_count_half + 1

        page_html_list = []
        # 添加前面的nav和ul标签
        page_html_list.append('''
                    <nav aria-label='Page navigation>'
                    <ul class='pagination'>
                ''')
        first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
        page_html_list.append(first_page)

        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)

        page_html_list.append(prev_page)

        for i in range(pager_start, pager_end):
            if i == self.current_page:
                temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)
            else:
                temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
            page_html_list.append(temp)

        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
        page_html_list.append(next_page)

        last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
        page_html_list.append(last_page)
        # 尾部添加标签
        page_html_list.append('''
                                           </nav>
                                           </ul>
                                       ''')
        return ''.join(page_html_list)
复制代码

分页器使用

复制代码
"""
当我们需要使用到非django内置的第三方功能或者组件代码的时候
我们一般情况下会创建一个名为utils文件夹 在该文件夹内对模块进行功能性划分
    utils可以在每个应用下创建 具体结合实际情况

我们到了后期封装代码的时候 不再局限于函数
还是尽量朝面向对象去封装

我们自定义的分页器是基于bootstrap样式来的 所以你需要提前导入bootstrap
    bootstrap 版本 v3
    jQuery        版本 v3
"""
# 后端
def get_book(request):
book_queryset = models.Book.objects.all() current_page = request.GET.get('page',1) all_count = book_queryset.count() # 1 传值生成对象 page_obj = Pagination(current_page=current_page,all_count=all_count) # 2 直接对总数据进行切片操作 page_queryset = book_queryset[page_obj.start:page_obj.end] # 3 将page_queryset传递到页面 替换之前的book_queryset return render(request,'booklist.html',locals()) # 前端 {% for book_obj in page_queryset %} <p>{{ book_obj.title }}</p> <nav aria-label="Page navigation"> </nav> {% endfor %} {#利用自定义分页器直接显示分页器样式#} {{ page_obj.page_html|safe }}
复制代码

 

posted @   椰子皮0oo0  阅读(78)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
1
点击右上角即可分享
微信分享提示