• ajax,分页器


    一、ajax请求数据

    '''
    $.ajax({
        url: '/ajax/',  # 请求路径
        type: 'post',  # 请求方式
        data: {  # get和post都以data字典方式携带数据
            usr: $('.usr').val(),  # 获取输入框内容
            pwd: $('.pwd').val(),
        },
        success: function (data) {
            console.log(typeof(data), data);  # 得到后台返回的数据(普通字符串 | json类型数据)
        }
    })
    '''
    
    '''
    # ajax请求,后台只需要返回信息,所以不会出现render、redirect
    def ajax(request):
        print(request.is_ajax())  # 是否是ajax请求
        if request.method == 'GET':  # 获取get请求数据
            usr = request.GET.get('usr', None)
            pwd = request.GET.get('pwd', None)
        if request.method == 'POST':  # 获取post请求数据
            usr = request.POST.get('usr', None)
            pwd = request.POST.get('pwd', None)
        
        # 返回字符串类型数据
        # return HttpResponse('OK')  # ***
    
        # 返回json类型数据
        dic = {'status': 'ok', 'msg': '登录成功'}
        data = json.dumps(dic, ensure_ascii=False)
        # 直接返回json模块处理后的json数据(json字符串),前台接收到的是一个json类型的字符串,需要前台自己处理
        # return HttpResponse(data)
        
        # 返回json字符串是,还告诉前台,该数据就是json类型字符串,设置响应头
        return HttpResponse(data, content_type='application/json')  # ****
        
       
          from django.http import JsonResponse
        # 返回json类型数据的终极方法
        dic = {'status': 'ok', 'msg': '登录成功'}
        return JsonResponse(dic, safe=False, json_dumps_params={'ensure_ascii': False})  # *****
        # 参数含义:
        # 返回值保证是字典类型
        # safe在False情况下就支持返回列表或字符串
        # 取消json的dumps方法采用的默认ascii编码中文
    '''

    二、分页器

    from django.core.paginator import Paginator
    
    # 分页对象列表
    book_list = Book.objects.all()
    # 分页对象
    paginator = Paginator(book_list, 6)  # 分页对象列表,每一页对象(最大)数
    # 对象总个数
    count = paginator.count
    # 总分页数
    num_pages = paginator.num_pages
    # 页码列表(可迭代对象)
    page_range = paginator.page_range
    
    # 某一具体页
    page = paginator.page(3)  # 具体第几页
    # 是否有上一页
    page.has_previous()
    # 上一页编码
    page.previous_page_number()
    # 是否有下一页
    page.has_next()
    # 下一页编码
    page.next_page_number()
    #后台
    '''
    def show_book(request):
        book_list = Book.objects.all()
        header = '图书管理系统'
        title = '图书详情'
    
        #得到分页器(分页的数据,一页的个数)
        paginator = Paginator(book_list,5)
        #对象总个数
        count = paginator.count
        #总分页数
        num_pages = paginator.num_pages
        #页码列表(可迭代对象)
        page_range = paginator.page_range
    
    
        #请求有误默认采用第一页
        try:
            current_num = int(request.GET.get('page',1))
        except:
            current_num = 1
        #不在页面范围内安全处理
        if current_num < 1:
            current_num =  1
            return redirect('/show_book/?page=%s'%current_num)
        elif current_num > num_pages:
            current_num = num_pages
            return redirect('/show_book/?page=%s'%num_pages)
    
        #获取某一具体页
        current_page = paginator.page(current_num)
    
        #通过page_range来控制页面排版
        if num_pages > 5:
            if current_num < 4:
                page_range = range(2,5)
            elif current_num > num_pages - 3:
                page_range = range(num_pages - 3,num_pages)
            else:
                page_range = range(current_num - 1,current_num + 2)
        elif num_pages >= 3:
            page_range = range(2,num_pages)
        else:
            page_range = range(1,1)
    
    
        return render(request,'show_book.html', locals())
    '''
    #前台   
    <!--分页器-->
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <!-- 上一页 -->
                <li>
                    {% if current_num > 1 %}
                        <!--大于1点击上一页到上一页-->
                        <a href="{% url 'show_book' %}?page={{ current_num|add:-1 }}" aria-label="Previous">
                    {% else %}
                         <!--等于小于1不能点击-->
                        <a href="javascript:void(0)" aria-label="Previous">
                    {% endif %}
                    <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <!-- 第一页页码 -->
                {% if current_num == 1 %}
                    <li class="active">
                {% else %}
                    <li>
                {% endif %}
                <a href="{% url 'show_book' %}?page=1">1</a></li>
    
    
                <li><a href="javascript:void(0)">...</a></li>
    
                <!-- 中间三页页码 -->
                {% for num in page_range %}
                    {% if current_num == num %}
                        <li class="active">
                    {% else %}
                        <li>
                    {% endif %}
                <a href="{% url 'show_book' %}?page={{ num }}">{{ num }}</a></li>
                {% endfor %}
    
                <li><a href="javascript:void(0)">...</a></li>
    
                <!-- 最后一页页码 -->
                {% if current_num == num_pages %}
                    <li class="active">
                {% else %}
                    <li>
                {% endif %}
                <a href="{% url 'show_book' %}?page={{ num_pages }}">{{ num_pages }}</a></li>
    
                <!-- 下一页 -->
                <li>
                    <!--小于总页数,点击下一页定位到下一页-->
                    {% if current_num < num_pages %}
                        <a href="{% url 'show_book' %}?page={{ current_num|add:1 }}" aria-label="Next">
                    <!--等于或大于总页数不能点击-->
                    {% else %}
                        <a href="javascript:void(0)" aria-label="Next">
                    {% endif %}
                    <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
            </ul>
        </nav>
    
    
    <!--后台获取固定页book对象 {% for book in current_page %}-->

    三、批量插入数据

    book_list = []
    for i in range(100):
        book = Book(name='book%s' % i, price=11.11, publish_date='2018-1-1', publish_id=1)
        book_list.append(book)
    # 操作对象列表,一次操作多少条数据
    Book.objects.bulk_create(book_list, 20)  # 插入100条数据只需要执行5次sql
  • 相关阅读:
    面向接口编程详解(二)——编程实例
    面向接口编程详解(一)——思想基础
    设计模式之面向接口编程
    EF数据注解
    很多人不知道可以使用这种 key 的方式来对 Vue 组件时行重新渲染
    这是最新的一波Vue实战技巧,不用则已,一用惊人
    Node.js 进阶-你应该知道的 npm 知识都在这
    Vue响应式原理
    eslint规则
    简述vue-cli中chainWebpack的使用方法
  • 原文地址:https://www.cnblogs.com/lizeqian1994/p/10532577.html
Copyright © 2020-2023  润新知