zoukankan      html  css  js  c++  java
  • sweetalert, bulk_create, 分页器

    ajax结合sweetalert实现删除操作的二次确认

    修改网页上某个标签的样式

    f12-->inspect-->Styles-->background-color

    f12-->inspect-->div.sweet-alert.showSweetAlert

    报错: Forbidden (CSRF token missing or incorrect.): /

    解决: settings.py-->MIDDLEWARE-->注释掉'django.middleware.csrf.CsrfViewMiddleware',

    def home(request):
        import time
    
        if request.is_ajax():
            time.sleep(2)  # 模拟两秒延迟
            back_dic = {'code': 1000, 'msg': ''}
            delete_id = request.POST.get('delete_id')
            models.User.objects.filter(pk=delete_id).delete()
            back_dic['msg'] = '数据已经删除'
    
            # 通常后端会将ajax请求数据的处理结果以字典形式返回,
            # JsonResponse会自动将后端的字典转换成前端的object类型数据
            return JsonResponse(back_dic)
    
        user_queryset = models.User.objects.all()
        return render(request, 'home.html', locals())
    
    '''
        <style>
            div.sweet-alert.showSweetAlert {  # 标签选择器 + 类选择器修改背景色
                background-color: yellow;
            }
    
            div.sweet-alert.showSweetAlert h2 {  # 标签选择器 + 类选择器 + 后代选择器修改内边距
                padding: 25px;
            }
        </style>
        
    
                            <td>{{ user_obj.get_gender_display }}</td>  # 函数自动加括号调用
                                <a href="#" class="btn btn-primary btn-sm">编辑</a>  # 加#使页面不会一直刷新
                                <a href="#" class="btn btn-danger btn-sm cancel" user_id="{{ user_obj.pk }}">删除</a>
                                # 不能使用id标识标签, for循环会出现多个重复标签  # 自定义user_id属性标识要删除的数据的主键id
       
    <script>
        $('.cancel').on(
            'click',
            function () {
                var $btn = $(this);  // 指代当前被点击的a标签
                swal({
                        ...
                        showLoaderOnConfirm: true,  // 网络延迟等待动画效果
                    },
                    function (isConfirm) {
                        if (isConfirm) {  // 在弹出已经删除框前发送删除数据的ajax请求
                            $.ajax({
                                url: '',
                                type: 'post',
                                data: {'delete_id': $btn.attr('user_id')},
                                success: function (data) {
                                    if (data.code == 1000) {
                                        swal('准备跑路吧!', '已经删了', 'success');
                                        $btn.parent().parent().remove();  // 通过DOM操作在页面不刷新情况下直接删除数据行标签
                                    }
                                    ...
            }
        )
    </script>
    </body>
    '''
    

    bulk_create快速批量插入数据

    def insert(request):
        book_list = []
        for i in range(1000):
            book_obj = models.Book(title='第%s本书' % (i,))  # 先生成book对象并添加到book列表
            book_list.append(book_obj)
        models.Book.objects.bulk_create(book_list)  # 批量插入数据
    

    简易版分页器推导

    def insert(request):
        all_count = models.Book.objects.count()  # 总的数据数
        per_page_num = 10  # 每页展示的数据量
        page_amount, data_remaining = divmod(all_count, per_page_num)  # 总页数向下取整, 数据分页后剩余数据量
        if data_remaining:
            page_amount += 1  # 如果分页后有剩余数据, 分页数+1
    
        current_page = int(request.GET.get('page', 1))  # 起始页, 默认为1
        html = ''  # 记录分页器展示的页码
        temp = current_page  # 临时变量处理分页器左边界展示
        if temp <= 5:
            temp = 5
        for i in range(temp - 5, temp + 5):
            # 将用户点选的页码高亮显示
            if i + 1 == current_page:  
                html += '<li class="active"><a href="?page=%s">%s</a></li>"' % (i + 1, i + 1,)
            
            # 每次以用户点选也为中心展示10页
            else:  
                html += '<li><a href="?page=%s">%s</a></li>"' % (i + 1, i + 1,)
    
        stat_data_index = (current_page - 1) * per_page_num  # 每页的起始数据的索引值
        end_data_index = current_page * per_page_num  # 每页的结束数据的索引值
    
        show_book_queryset = models.Book.objects.all()[stat_data_index:end_data_index]  # 展示用户想获取的页码中的数据
        return render(request, 'insert.html', locals())
    
    
    '''
    ...
                {% for book_obj in show_book_queryset %}
                    <p>{{ book_obj }}</p>
                {% endfor %}
                ...
                    ...  # 分页器开始
                            </li>
                            {{ html|safe }}  # 前端取消转义
                           ...
    '''
    

    自定义分页器的使用

    一般创建utils文件夹存放第三方组件

    django内置的分页模块不好用

    queryset支持切片操作

    def insert(request):
        all_count = models.Book.objects.count()  # 总的数据数
    
        current_page = int(request.GET.get('page', 1))  # 当前页
    
        queryset = models.Book.objects.all()
        page_obj = Pagination(current_page, all_count, 10, 10)
        page_data = queryset[page_obj.start: page_obj.end]
        return render(request, 'insert.html', locals())
    
    '''
    class Pagination(object):
        def __init__(self, current_page, all_count, per_page_num=10, pager_count=10):
            """
            封装分页相关数据
            :param current_page: 当前页
            :param all_count:    数据库中的数据总条数
            :param per_page_num: 每页显示的数据条数
            :param pager_count:  分页器显示的页码数量
    
            用法:
            queryset = model.tableName.objects.all()
            page_obj = Pagination(current_page, all_count, per_page_num=10, pager_count=10)
            page_data = queryset[page_obj.start:page_obj.end]
            前端获取每页展示的数据用page_data
            前端使用分页器及其显示的页码数量用page_obj.page_html
            
            ...
    '''
    
  • 相关阅读:
    strftime和strptime函数对时间的转换操作
    第四章文件和目录学习笔记
    getenv和putenv在获取和设置环境变量中的使用
    SQL 常用语句以及函数(个人收藏)
    详测 Generics Collections TQueue (2): Create、Count、Clear、TrimExcess
    详测 Generics Collections TQueue (1): Enqueue、Dequeue、Peek
    详测 Generics Collections TList (9): BinarySearch
    详测 Generics Collections TList (8): Sort
    详测 Generics Collections TList (4): AddRange、InsertRange、DeleteRange
    详测 Generics Collections TList (7): Items、Contains
  • 原文地址:https://www.cnblogs.com/-406454833/p/11983998.html
Copyright © 2011-2022 走看看