• django 分页和cookie


    分页功能实现

    首先在models.py文件中创建一个Host表,在里面添加数据。

    from django.db import models
    
    class Host(models.Model):
            HostName = models.CharField(max_length=256)
            IP = models.GenericIPAddressField()

    在views.py中主要是使用mark_safe这个函数渲染字符串

    def index(request,page):
        try:
            page = int(page)
        except:
            page = 1
        counts = models.Host.objects.all().count()
        #确定分页数量
        per_item = 10
        start = (page-1)*per_item
        end = page*per_item
        temp = divmod(counts,per_item)
        if temp[1] == 0:
            all_page_count = temp[0]
        else:
            all_page_count = temp[0] + 1
        result = models.Host.objects.all()[start:end]
        #渲染分页
        page_html = []
        first_html = "<a href='/app06/index/%d'>首页</a>" % (1)
        page_html.append(first_html)
        if page <= 1:
            prev_html = "<a href='#nowhere'>上一页</a>"
        else:
            prev_html = "<a href='/app06/index/%d'>上一页</a>" % (page-1)
        page_html.append(prev_html)
        for i range(all_page_count):
            if page == i+1:
                a_html = "<a class='selected 'href='/app06/index/%d'>%d</a>" % (i+1,i+1)
            else:
                a_html = "<a 'href='/app06/index/%d'>%d</a>" % (i+1,i+1)
        next_html = "<a href='/app06/index/%d'>下一页</a>" % (page+1)
        page_html.append(next_html)
        end_html = "<a href='/app06/index/%d'>尾页</a>" % (all_page_count)
        page_html.append(end_html)
        page_string = mark_safe(''.join(page_html))
        ret = {'data':result,'count':counts,'page':page_string}
        return render_to_response('fenye.html',ret)

    首先根据总条目和每页的条目计算出分页的数量;获取到所有的主机条目;然后分页,首页,上一页,下一页,尾页,在for循环中遍历所有页的数量,当遍历的条目i+1(从0开始)

    与page相等时,就是当前页,否则是其他页。

    在fenye.html中

    <table border="1px solid #c40000">
    {% for item in data %}
           <tr>
                <td>{{ item.HostName }}</td>
                <td>{{ item.IP }}</td>
           </tr>
    {% endfor %}
    </table>
    <div>总条数:{{ count }}</div>
    <div id='Pageing'>{{ page }}</div>

    对代码进行改进

    使用面向对象的思想将分页部分封装,与渲染部分放在一个新的html_helper.py文件中:

    class PageInfo(object):
        def __init__(self,current_page,all_count,per_item=5):
            self.CurrentPage = current_page
            self.AllCount = all_count
            self.PerItem = per_item
        @property                     #通过装饰器@property可以将类的方法以属性的方式调用
        def start(self):
            return (self.CurrentPage-1)*self.PerItem
        @property
        def end(self):
            return self.CurrentPage*self.PerItem
        @property
        def All_page_count(self):
            temp = divmod(self.AllCount,self.PerItem)
            if temp[1] == 0:
                all_page_count = temp[0]
            else:
                all_page_count = temp[0]+1
            return all_page_count
            
    def Pager(page,all_page_count):
        page_html = []
        first_html = "<a href='/app06/index/%d/'>首页</a>" % (1)
        page_html.append(first_html)
        if page <= 1:
            prev_html = "<a href='#nowhere'>上一页</a>"
        else:
            prev_html = "<a href='/app06/index/%d'>上一页</a>" % (page-1)
        page_html.append(prev_html)
        #让当前页在中间显示
        begin = page - 6
        end = page + 5
        if all_page_count < 11:
            begin = 0
            end = all_page_count
        else:
            if page < 6:
                begin = 0
                end = 11
            else:
                if page + 6 > all_page_count:
                    begin = page - 5
                    end = all_page_count
                else:
                    begin = page - 6
                    end = page + 5
        
        for i in range(begin,end):
            if page == i+1:
                a_html = "<a href='/app06/index/%d/' class='selected'>%d</a>" % (i+1,i+1)
            else:
                a_html = "<a href='/app06/index/%d/'>%d</a>" (i+1,i+1)
            page_html.append(a_html)
        
        next_html = "<a href='/app06/index/%d'>下一页</a>" % (page+1)
        page_html.append(next_html)
        end_html = "<a href='/app06/index/%d/'>尾页</a>" % (all_page_count)
        page_html.append(end_html)
        page_string = mark_safe(''.join(page_html))
        return page_string

    这样在views.py中就可以修改为:

    def index(request,page):
        try:
            page = int(page)
        except Exception as e:
            page = 1
        counts = models.Host.objects.all().count()
        print(page)
        pageObj = html_helper.PageInfo(page,counts,per_item)
        result = models.Host.objects.all()[pageObj.start:pageObj.end]
        page_string = html_helper.Pager(page,pageObj.All_page_count)
        ret = {'data':result,'count':counts,'page':page_string}
        return render_to_response('fenye.html',ret)

    实现效果:

    可以通过设置cookie的方式改变每页的显示条目,在fenye.html中

    <table border="1px solid #c40000">
    {% for item in data %}
        <tr>
            <td>{{ item.HostName }}</td>
            <td>{{ item.IP }}</td>
        </tr>
    {% endfor %}
    </table>
    <div>总条数:{{ count }}</div>
    <div id='Pageing'>{{ page }}</div>
    <div>
        <select id='s1' onchange="ChangePageItem(this);">
        <option value='10'>10</option>
        <option value='30'>30</option>
        <option value='50'>50</option>
        <option value='100'>100</option>
        <option value='500'>500</option>
        </select>
    </div>
    <script type='text/javascript'>
    //当页面加载完成时执行,获取初始cookie的值
    $(function(){
        var per_item = $.cookie('pager_num');
        if(per_item){
            $('#s1').val(per_item); 
        }
        else{
            $.cookie('pager_num',10,{path:'/'});
        }
    })
    function ChangePageItem(arg){
        //创建或修改cookie的值,当发生改变时
        var value = $(arg).val();
        $.cookie('pager_num',value,{path:'/'});
    }
    </script>

    在views.py中修改为,其他文件保持不变

    def index(request,page):
        try:
            per_item = int(request.COOKIES.get('pager_num',10))
        except Exception as e:
            per_item = 10
        print(request.COOKIES)
        try:
            page = int(page)
        except Exception as e:
            page = 1
        counts = models.Host.objects.all().count()
        print(page)
        pageObj = html_helper.PageInfo(page,counts,per_item)
        result = models.Host.objects.all()[pageObj.start:pageObj.end]
        page_string = html_helper.Pager(page,pageObj.All_page_count)
        ret = {'data':result,'count':counts,'page':page_string}
        return render_to_response('fenye.html',ret)

    实现效果:

    当改变显示数量时

  • 相关阅读:
    Core Animation系列之CADisplayLink(转)
    由App的启动说起(转)
    Xcode断点的一些黑魔法
    好代码的标准
    Java JPS找不到正在执行的java进程 jps cannot see running java process
    JetBrain server certificate is not trusted 弹出框
    Window7 定制 Explore中的右键菜单
    Go语言入门: Chapter1
    针对缓存在Redis中的聊天消息的持久化方案分析
    轻型Database- sqlite入门
  • 原文地址:https://www.cnblogs.com/homle/p/8639606.html
Copyright © 2020-2023  润新知