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
        
        ...
'''
原文地址:https://www.cnblogs.com/-406454833/p/11983998.html